具有内核尺寸的Canny边缘检测器> 7

时间:2015-11-24 11:30:54

标签: c++ opencv edge-detection

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

例如,

// 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):

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

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

我想这与他们正在使用某些班次操作的事实有关,

#define CANNY_SHIFT 15
const int TG22 = (int)(0.4142135623730950488016887242097*(1<<CANNY_SHIFT) + 0.5);

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

1 个答案:

答案 0 :(得分:3)

看一下OpenCV doc:

Canny

  

apertureSize: Sobel算子的光圈大小。

对于Sobel

  

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

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

这已通过source code验证:

 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非最大值抑制进行编码。

然而,面具大于3x3的Sobel在实践中很少使用。