IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

dérivée premiere d'une image dI(x, y)/dx en utilisant le filtre horizontal (-1 0 1)


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur réglementation télécoms
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur réglementation télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut dérivée premiere d'une image dI(x, y)/dx en utilisant le filtre horizontal (-1 0 1)
    j'ai essayée de faire un programme permettant la dérivée d'intensité d'un pixel a l'emplacement (x,y) en utlisant le filtre horizontal (-1 0 1) puis mettre les intensités des pixels derivées dans un nouvel matrice (la methode utilisé est la convolution de la matrice d'image avec le filtre ). le but est d'afficher l'image dérivée en x : Ix(x,y)= valeur absolu (dI(x,y)/dx)
    le probleme ici ce que l'image dx1 n'est pas affichée pourquoi? quel est l'erreur? J'ai aucun probleme de compilation. emm derniere remarque le type de retour d'un pixel est un scalaire mais je voudrais comme resultat un entier. aidez- moi pour resoudre ce probleme SVP
    j'aimerais b1 savoir si mon idée est optimisée ou pas ainsi le probleme qui empeche l'affichage de l'image dérivée et merci d'avance
    le code est comme suivant:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <opencv2\core\core.hpp>
    #include <opencv2\highgui\highgui.hpp>
    #include <iostream>
    #include "stdio.h"
    #include <opencv/cxcore.h>
    #include <opencv/cv.h>
     
     
    using namespace cv;
    using namespace std;
     
    int main()
         {
                  Mat img = imread("C:/Users/sbi/Desktop/fire/Images/img1.png"); //read the image data in the file "image.JPG" and store it in 'img'
     
         if (img.empty()) //check whether the image is loaded or not
         {
              cout << "Error : Image cannot be loaded..!!" << endl;
              //system("pause"); //wait for a key press
              return -1;
         }
          namedWindow("MyWindow1", CV_WINDOW_AUTOSIZE);
         imshow("MyWindow1", img);
         waitKey(0);
         Mat img_gray;
         GaussianBlur( img, img, Size(3,3), 0, 0, BORDER_DEFAULT);
          cvtColor( img, img_gray, CV_BGR2GRAY);
           namedWindow("MyWindow2", CV_WINDOW_AUTOSIZE);
         imshow("MyWindow2", img_gray);
         waitKey(0);
          int dx=0;
          Mat dx1(img_gray.size(), img_gray.type());
     
         for (int i=2; i<img_gray.rows; i++)
             {
                 for (int j=2; j<img_gray.cols; j++)
                     {
     
                         dx= (-1)*img_gray.at<uchar>(i-1,j) + img_gray.at<uchar>(i+1,j);
                         //cout<<"dx="<<dx;
                         dx1.at<uchar>(i-1, j-1)= abs(dx);
     
                                      }
                     }
             namedWindow("MyWindow3", CV_WINDOW_AUTOSIZE);
                imshow("MyWindow3",dx1);
                waitKey(0);
             return 0;
         }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Je suis en train de regarder le code.
    Premiere erreur, tu parcours ton image de i = 2 a i < img.cols.
    Ensuite tu accedes aux pixels (i+1,j).
    Donc en gros tu sors de ton image.

    Ensuite, tu semble vouloir calculer la derive sur les x, mais tu la calcule sur les y.

    je fini de recopier et compiler ton code et j'edite mon message.

    Bon, voila ton code en version un peu plus propre.
    Chez moi cela fonctionne sans probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    void calc_derivative_x(Mat &image, Mat &output){
     
       if (image.empty()) return;
     
       Mat gray;
       cvtColor(image,gray,CV_BGR2GRAY);
       GaussianBlur(gray,gray,Size(3,3),0);
     
       output.create(gray.size(),gray.type());
     
       for(int y = 0; y < gray.rows; y++){
          for(int x = 1; x < gray.cols-1; x++){
             int dx = 0 + gray.at<unsigned char>(y,x+1) - gray.at<unsigned char>(y,x-1);
             if (dx <= 0 ) dx = -dx;
             output.at<unsigned char>(y,x) = dx;
          }
       }
       imshow("input",image);
       imshow("Derivative",output);
       waitKey();
    }
    Voila. Bon sinon, dans opencv, tu as des fonctions qui existe pour faire de genre de calcul et qui sont vraiment optimisees.
    Ensuite, si tu veux avoir le resultat dx/I, tu dois passer par une matrice de CV32F, ensuite tu normalise ta matrice et la reconvertie en CV8UC1 pour l'afficher.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieur réglementation télécoms
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur réglementation télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Oui on peut utiliser la fonction Sobel merciii beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/03/2015, 15h31
  2. Comment calculer la dérivée seconde d'une image
    Par janhong dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 14/05/2014, 16h39
  3. Fixer une image en PREMIER plan
    Par ldoud dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 01/06/2010, 18h19
  4. afficher une image et sa légende sans l'utilisation de tableaux
    Par cynoq dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/04/2010, 14h36
  5. Dérivée d'une image
    Par zicos dans le forum Images
    Réponses: 2
    Dernier message: 03/06/2007, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo