为什么用于边缘检测的 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 edge
或 online 查看它的源代码来了解 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 矩阵中创建。
这是最终结果:
我尝试将以下八度代码应用于图像:
sq = imread("Square BW.jpg");
figure(1), imshow(Square);
cont1 = edge(sq,"Sobel");
figure(2), imshow(cont1);
我得到的图像是:
如果我使用 Prewitt 函数,则会出现类似的图像。谁能向我解释发生了什么?问题是我无法仅将结果可视化,所以我不明白为什么代码不起作用。
问题似乎出在 Octave 中如何计算阈值。您可以通过在 Octave 提示符下输入 type edge
或 online 查看它的源代码来了解 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 矩阵中创建。 这是最终结果: