Différence entre "détection de bord" et "Contours de L'Image""

regardez le code suivant

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

Mat src, grey;
int thresh = 10;

const char* windowName = "Contours";

void detectContours(int,void*);

int main()
{
    src = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg");

    //Convert to grey scale
    cvtColor(src,grey,CV_BGR2GRAY);

    //Remove the noise
    cv::GaussianBlur(grey,grey,Size(3,3),0);

    //Create the window
    namedWindow(windowName);

    //Display the original image
    namedWindow("Original");
    imshow("Original",src);

    //Create the trackbar
    cv::createTrackbar("Thresholding",windowName,&thresh,255,detectContours);

    detectContours(0,0);
    waitKey(0);
    return 0;

}

void detectContours(int,void*)
{
    Mat canny_output,drawing;

    vector<vector<Point>> contours;
    vector<Vec4i>heirachy;

    //Detect edges using canny
    cv::Canny(grey,canny_output,thresh,2*thresh);

    namedWindow("Canny");
    imshow("Canny",canny_output);

    //Find contours
    cv::findContours(canny_output,contours,heirachy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));

    //Setup the output into black
    drawing = Mat::zeros(canny_output.size(),CV_8UC3);



    //Draw contours
    for(int i=0;i<contours.size();i++)
    {
        cv::drawContours(drawing,contours,i,Scalar(255,255,255),1,8,heirachy,0,Point());
    }

    imshow(windowName,drawing);

}

Théoriquement, Contours signifie courbe de détection. Edge detection signifie détection des bords. Dans mon code ci-dessus, j'ai fait la détection de bord en utilisant Canny et la détection de courbe par findContours(). Voici les images résultantes

Futé Image

enter image description here

Image Des Contours

enter image description here

OK, donc maintenant, comme vous pouvez voir, il n'y a pas de différence! Alors, quelle est la réelle différence entre ces 2? Dans les tutoriels OpenCV, seul le code est donné. J'ai trouvé une explication sur ce qu'est Contours mais il n'aborde pas cette question.

s'il vous Plaît aider!

24
demandé sur Yohan Weerasinghe 2013-06-14 11:56:44

4 réponses

Bords sont calculés comme des points qui sont des extrêmes du gradient d'image dans la direction du gradient. si cela aide, vous pouvez penser à eux comme les points min et max dans une fonction 1D. Le fait est que les pixels de bord sont une notion locale: ils indiquent juste une différence significative entre les pixels voisins.

Contours sont souvent obtenus à partir des bords, mais ils sont destinés à être contours de l'objet. Ainsi, ils ont besoin d'être fermé courbe. Vous pouvez y penser comme limites (certains algorithmes de traitement D'Image et les bibliothèques les appellent comme ça). Lorsqu'ils sont obtenus à partir des bords, vous devez connecter les bords afin d'obtenir un contour fermé.

42
répondu sansuiso 2013-06-14 08:45:34

la principale différence entre trouver des bords et des countours est que si vous exécutez trouver des bords la sortie est une nouvelle image. Dans cette nouvelle image (edge image) vous aurez les bords surlignés. Il existe de nombreux algorithmes pour détecter les contours regardez wiki voir aussi.

par exemple, l'opérateur Sobel donne des résultats "brumeux". Dans votre cas particulier, le piège est que vous utilisez un détecteur de bord rusé. Celui-ci fait quelques pas de plus que les autres détecteurs. Il va effectivement autre bord de raffinement étapes. La sortie du détecteur Canny est donc une image binaire, avec des lignes larges de 1 px à la place des bords.

d'un autre côté Contours l'algorithme traite l'image binaire arbitraire. Donc, si vous mettez en blanc rempli carré sur fond noir. Après l'exécution de Contours algorithme, vous obtiendriez blanc carré vide, juste les frontières.

autre bonus ajouté de détection de contour est, il retourne en fait ensemble de points! C'est génial, parce que vous pouvez utiliser ces points plus loin pour certains traitements.

dans votre cas particulier, ce n'est qu'une coïncidence si les deux images concordent. Il ne règle pas, et dans votre cas, c'est à cause de la propriété unique de L'algorithme rusé.

6
répondu jnovacho 2013-06-14 08:44:22

les Contours peuvent en fait faire un peu plus que "juste" détecter les contours. L'algorithme trouve effectivement les contours des images, mais les place aussi dans une hiérarchie. Cela signifie que vous pouvez demander des bordures externes d'objets détectés dans vos images. Une telle chose ne serait pas (directement) possible si vous vérifiez seulement les bords.

comme on peut le lire dans la documentation, les contours sont surtout utilisés pour la reconnaissance d'objets, où le détecteur de bord canny est une opération plus "globale". Je ne serais pas surpris si l'algorithme de contour utilise une sorte de détection de bord rusé.

3
répondu Nallath 2013-06-14 08:14:15

la notion de contours est utilisée comme outil pour travailler sur les données de bord. Pas toutes les arêtes sont de même. Mais dans de nombreux cas, par exemple les objets avec une distribution de couleur unimodale (c.-à-d. une couleur), les bords sont les contours réels (contour, forme).

  1. détecte non seulement les courbes, mais tout ce qui est connecté sur la carte de bord. (connected component analysis)[1]
  2. utile pour les objets avec une distribution de couleur unimodale (un masque de premier plan se trouve facilement avec un seuil simple). Votre échantillon l'image n'est pas adapté.

[1]Analyse topologique de la structure des binaires numérisés Images par Border suivi de Satoshi Suzuki, 1985.

2
répondu William 2013-06-14 11:46:58