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
Image Des Contours
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!
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é.
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é.
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é.
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).
- détecte non seulement les courbes, mais tout ce qui est connecté sur la carte de bord. (connected component analysis)[1]
- 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.