Canny边缘检测算法中只需要一个边缘吗?

7
当我使用Canny边缘算法时,它会产生两条与粗色线相反的边缘,正如预期的那样,但是我只想显示一条边缘,以使我的线和曲线检测算法更简单,你有什么想法可以实现这个吗?
以下是代码:

enter image description here

bool CannyEdgeDetection(DataStructure& col)
{

Mat src, src_gray;
Mat dst, detected_edges, fin;
int WhiteCount = 0, BCount = 0;

char  szFil1[32] = "ocv.bmp";
char  szFil2[32] = "dst.bmp";
src = imread(szFil1);
dst = imread(szFil1);
blur( src_gray, detected_edges, Size(3,3) );
Canny( src, dst, 100, 200, 3 );
imwrite(szFil2, dst );

IplImage* img = cvLoadImage(szFil2);
int height    = img->height;
int width     = img->width;
int step      = img->widthStep;
int channels  = img->nChannels;
uchar * datau      = (uchar *)img->imageData;

for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
for(int k=0;k<channels;k++){
datau[i*step+j*channels+k] = 255 - datau[i*step+j*channels+k];   
if (datau[i*step+j*channels+k]==0){
WhiteCount++;
col.pixel_col [i][j] = 2;
}
else{BCount++;
col.pixel_col[i][j] = 0;
}
}
}
}

cvSaveImage("img.bmp" ,img);

return 0;

}

这不是原始图像,但相似:

在此输入图像描述

我应该注释哪一部分才能读取黑色背景中的图片?或任何有颜色的图片?

bool done;
do
{
  cv::morphologyEx(img, temp, cv::MORPH_OPEN, element);
  cv::bitwise_not(temp, temp);
  cv::bitwise_and(img, temp, temp);
  cv::bitwise_or(skel, temp, skel);
  cv::erode(img, img, element);

  double max;
  cv::minMaxLoc(img, 0, &max);
  done = (max == 0);
} while (!done);

你都尝试过哪些方法了?能发一下代码吗?或者至少提供输入图片? - dom
你能上传您原始图片的链接吗?也许其他人可以提供更好的方法。 - Abid Rahman K
最简单的方法是调整图像大小 - 将其缩小到边缘为1-2个像素。这样你就会得到1像素的Canny边缘和即时性能提升。 - Sam
1个回答

3
那个过程被称为“骨架化”或“细化”。你可以通过谷歌搜索了解相关信息。
这里有一个简单的骨架化方法:skeletonization OpenCV In C# 下面是应用上述方法到你的图像后得到的输出(在骨架化之前,图像被反转了,因为上述方法适用于“黑色背景中的白色图像”,与你的输入图像相反)。

enter image description here


这看起来非常有用,为什么在图像处理中不推荐使用骨架化而选择Canny算子呢(我猜是因为我根本没有听说过骨架化)? - Gambit King
我不确定。也许在细化之前检查白色和黑色像素的数量,并决定是否反转可能会起作用,因为通常背景区域比前景区域更大。 - Abid Rahman K
因为我已经在画图中倒转了图像,然后再应用算法,否则它就无法工作。 - Gambit King
你不需要手动翻转图像。你可以使用cv2.bitwise_not()函数来编程地翻转图像。 - Abid Rahman K
我已经在上面发布了代码,使用bitwise_not函数时它没有产生任何输出,但是当我在画图中反转图像然后运行程序时它可以工作。 - Gambit King
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接