首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核大小>7的Canny边缘检测器

核大小>7的Canny边缘检测器
EN

Stack Overflow用户
提问于 2015-11-24 11:30:53
回答 1查看 5.3K关注 0票数 3

为什么不能在内核大小大于7的OpenCV中执行Canny边缘检测?

例如,

代码语言:javascript
复制
// This works
cv::Canny(src_image, out_edges, th1, 2 * th1, 3);
cv::Canny(src_image, out_edges, th1, 2 * th1, 7);

// This raises an exception
cv::Canny(src_image, out_edges, th1, 2 * th1, 9);

我知道Sobel只使用1、3、5或7的内核大小,但是我看到了使用内核大小为9的论文。这在OpenCV中不可能吗?

*编辑*

我一直在编辑Canny代码以支持更大的内核。问题存在于这里(canny.cpp):

代码语言:javascript
复制
if (L2gradient)
{
  low_thresh = std::min(32767.0, low_thresh);
  high_thresh = std::min(32767.0, high_thresh);
  if (low_thresh > 0) low_thresh *= low_thresh;
  if (high_thresh > 0) high_thresh *= high_thresh;
}

代码语言:javascript
复制
if (L2gradient)
{
  low_thresh = std::min(32767.0, low_thresh);
  high_thresh = std::min(32767.0, high_thresh);

  if (low_thresh > 0) low_thresh *= low_thresh;
  if (high_thresh > 0) high_thresh *= high_thresh;
}

我想这与他们在使用某种移位操作有关,

代码语言:javascript
复制
#define CANNY_SHIFT 15
const int TG22 = (int)(0.4142135623730950488016887242097*(1<<CANNY_SHIFT) + 0.5);

因此,精度限制在16位,因此32767限制.我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2015-11-24 12:54:17

请看一下OpenCV文档:

对于机智

apertureSize: Sobel操作符的孔径大小。

对于索贝尔

ksize:扩展Sobel内核的大小;它必须是1、3、5或7。

因此,Canny中的孔径大小受到Sobel核大小的限制。

这在源代码中得到了验证:

代码语言:javascript
复制
 if ((aperture_size & 1) == 0 || (aperture_size != -1 && (aperture_size < 3 || aperture_size > 7)))
    CV_Error(CV_StsBadFlag, "Aperture size should be odd");

所以,除非你重写一些代码,否则就无法使用口径更大的Canny。您可以使用filter2d应用自定义的大型sobel滤波器,然后编写Canny non maxima抑制代码。

然而,使用比3x3更大的掩膜的Sobel在实践中很少使用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33892507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档