我尝试将以下代码应用于图像八度:
sq = imread("Square BW.jpg");
figure(1), imshow(Square);
cont1 = edge(sq,"Sobel");
figure(2), imshow(cont1);
我得到的图像是:
如果我使用 Prewitt 函数,就会出现类似的图像。谁能向我解释发生了什么?问题是我无法仅将结果可视化过程,因此我无法理解为什么代码不起作用。
我尝试将以下代码应用于图像八度:
sq = imread("Square BW.jpg");
figure(1), imshow(Square);
cont1 = edge(sq,"Sobel");
figure(2), imshow(cont1);
我得到的图像是:
如果我使用 Prewitt 函数,就会出现类似的图像。谁能向我解释发生了什么?问题是我无法仅将结果可视化过程,因此我无法理解为什么代码不起作用。
问题似乎是如何在 Octave 中计算阈值。type edge
您可以通过在 Octave 提示符下输入或在线查看其源代码来查看 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);
首先,我们创建与图像 Square BW 大小相同的 Sobel 矩阵/运算符和零矩阵。然后我们将 Sobel 矩阵旋转四次(旋转 90 度),以便在所有方向(左右、上下、左右和上下)上过滤图像,总是将结果添加到 mSobel 矩阵中,即创建的。这是最终结果: