【问题标题】:Canny edge detector with a single threshold value具有单个阈值的 Canny 边缘检测器
【发布时间】:2019-08-30 02:57:58
【问题描述】:

我正在尝试将一些 Matlab 代码移植到 C++。 我遇到过这条线:

edges = edge(gray,'canny',0.1);

示例图像的输出是全黑图像。我想使用 cv::Canny 重现相同的行为。低阈值和高阈值应该使用什么值?

示例:

输出:

【问题讨论】:

标签: matlab opencv edge-detection threshold


【解决方案1】:

在上面的行中,您没有定义阈值,那么它可能为零,从而提供黑色图片。此外,您使用 0.1 的 sigma,这意味着在第一个 Canny 步骤中几乎没有高斯模糊。在 Matlab 中,您可以通过以下方式获得优化的阈值:

 [~, th] = edge(gray,'canny');

然后应用优化后的阈值 th 乘以某个因子 f(根据我的经验 f 应该在 1-3 之间),你必须尝试一下:

 edges=edge(gray,'canny',f*th,'both', sigma);

sigma 默认为 sqrt(2)(您在上面使用了 0.1)。以下备注:

  • Matlab 将优化阈值计算为强度梯度分布的百分位数(如果我没记错的话,如果输入“edit edge”,您可以看到 edge() 的构造)
  • 上述参数th是一个由低阈值和高阈值组成的向量。 Matlab 总是使用 low_threshold = 0.4* high_threshold

【讨论】:

  • 那么,和 cv::Canny(m_gray, edges, 255*0.4, 255*1) 一样吗?它至少给了我相同的黑色输出。我没有编写matlab代码,它就在那里。我只想确保我的代码提供相同的输出,即使它是黑色图像。
  • 我认为等效的openCv代码是:GaussianBlur(m_gray, m_gray, Size(9,9), 0.1, 0.1); Canny(m_gray, 边, 255*0.4, 255*1);对吗?
  • 我检查了 Matlab 文档,发现以下语法:BW = edge(I,method,threshold)。用灰度图片尝试过,它给出了一个正常的精巧边缘,黑色地面上的白色边缘。所以 0.1 是高阈值(最大值为 1;即,使用 0.99 你只会得到几条边,使用 0.01 你会得到一百万条边。
  • 0.1 似乎是用于平滑的 sigma。这不是高阈值,如果我将高阈值设置为 0.1,将低阈值设置为 0.04,我会得到很多边缘。
  • 不,在上面的 Matlab 语法中,0.1 是高阈值。这就是我所说的,0.1 给出了正常的 Canny 图片 - 我在 Matlab 中尝试过。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2014-03-30
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多