【问题标题】:Need only one edge in Canny edge algorithmCanny边缘算法中只需要一个边缘
【发布时间】:2012-07-14 14:32:06
【问题描述】:

当我使用精明的边缘算法时,它会按预期产生与粗彩色线相对的 2 条边缘,但我希望只显示一个边缘,以使我的直线和曲线检测算法变得不那么复杂,任何想法我怎样才能做到这一点?

代码如下:

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);

【问题讨论】:

  • 到目前为止你尝试过什么?你能发布一些代码吗?或者至少是输入图像?
  • 您可以上传原始图片的链接吗?可能其他人可以提供更好的方法。
  • 最简单的方法是调整图像的大小 - 使其足够小以使边缘为 1-2 像素。您将拥有 1 像素精巧的边缘和即时的性能提升。

标签: c++ opencv image-processing edge-detection mathematical-morphology


【解决方案1】:

该过程称为skeletonizationthinning。你可以google一下。

这是simple method for skeletonizationskeletonization OpenCV In C#

下面是output,当我将上述方法应用于您的图像时(图像在骨架化之前反转,因为上述方法适用于white images in black background,与您的输入图像正好相反)。

【讨论】:

  • 这看起来真的很有用,为什么在图像处理中骨架化而不是精明(我假设这是因为我根本没有听说过这个)
  • 我不太清楚,但是canny边缘检测是常用的,而且骨架化仍然是一种发展中的方法,每天都在准备更多的方法(我的答案中的方法不是超好的)。无论如何我还没有使用骨架化。
  • 这令人印象深刻!但是如果您不知道图像或背景的颜色,它会起作用吗?
  • 我不确定。可能在细化之前检查白色和黑色像素的数量并决定是否反转,因为通常背景比前景具有更大的面积,因此可能会起作用。
  • 我也让它工作了.. 但我不想反转它。我应该注释掉哪个(不是,和,或)?
猜你喜欢
  • 2014-03-30
  • 1970-01-01
  • 2018-06-29
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2019-01-29
  • 2018-10-04
相关资源
最近更新 更多