为什么用于边缘检测的 Sobel 函数无法在黑色背景中找到白色方块的轮廓?

Why does the Sobel function for edge detection fail to find the contour of a white square in a black background?

我尝试将以下八度代码应用于图像:

sq = imread("Square BW.jpg"); 
figure(1), imshow(Square);

cont1 = edge(sq,"Sobel");
figure(2), imshow(cont1);

我得到的图像是:

如果我使用 Prewitt 函数,则会出现类似的图像。谁能向我解释发生了什么?问题是我无法仅将结果可视化,所以我不明白为什么代码不起作用。

问题似乎出在 Octave 中如何计算阈值。您可以通过在 Octave 提示符下输入 type edgeonline 查看它的源代码来了解 Octave 是如何做到的(我没有复制确切的代码,因为代码是 GPL——虽然很简单)

要获得边界,您需要自己设置阈值(希望在 Octave 的图像包的未来版本中这将得到修复,但目前它与 Matlab 不兼容,因为 Matlab 的默认文档尚不清楚)。

阈值的计算方式肯定有问题,但是我无法找到正确的值用于这张图片。经过多次尝试,我发现这段代码似乎可以完美运行:

sq = imread("Square BW.jpg"); 
maskSobel = fspecial("sobel");
mSobel = uint8(zeros(size(BW)));
for i = 0:3
  mSobel += imfilter(sq, rot90(maskSobel, i));
end
figure(1), imshow(mSobel);

首先我们创建 Sobel matrix/operator 和一个与图像 Square BW 大小相同的零矩阵。然后我们将 Sobel 矩阵旋转四次(90 度),以便在所有方向(左右,上下,左右和上下)过滤图像,始终将结果添加到 mSobel 矩阵中创建。 这是最终结果: