使用conv2
我正在实施Prewitt运算符进行边缘检测。这就是我正在尝试的:
b=[-1 -1 -1;0 0 0;1 1 1]/256;
c=[-1 0 1; -1 0 1; -1 0 1]/256;
Gx=abs(conv2(openImage,c,'same'));
Gy=abs(conv2(openImage,b,'same'));
G = sqrt( Gx.^2 + Gy.^2);
其中openImage
是灰度图像,然后我与MATLAB的实现与edge
进行比较:
edge(openImage,'Prewitt', [], 'both', 'nothinning');
所以,当我比较两个图像时:
因为可以看出它们并不完全相同,但我对实施非常肯定。这是什么原因?
答案 0 :(得分:3)
你的面具被错误的系数分割。您可以将每个系数标准化sum(abs(b(:)))
或sum(abs(c(:)))
,以确保在使用卷积蒙版进行过滤时,输出动态范围与输入匹配。
在你的情况下,你需要除以6而不是256.这就是为什么你在MATLAB中提供的对比度降低了。
从您之前的帖子中,我将使用此图片,因为它看起来像是在使用相同的图片:
请注意,因为没有指定edge
的阈值,所以它会自动计算出来。我实际上设法找到了正确的阈值,它是0.08995。
因此,试试这个:
%// Read image from StackOverflow
openImage = rgb2gray(imread('http://i.stack.imgur.com/5EJJH.jpg'));
openImage = im2double(openImage); %// Convert to double
%// Corrected masks
b=[-1 -1 -1;0 0 0;1 1 1]/6;
c=[-1 0 1; -1 0 1; -1 0 1]/6;
Gx=abs(conv2(openImage,c,'same'));
Gy=abs(conv2(openImage,b,'same'));
G = sqrt( Gx.^2 + Gy.^2);
out = G > 0.08995; %// Threshold image
figure;
imshow(out);
%// Also show output from edge
figure;
edge(openImage,'Prewitt', [], 'both', 'nothinning');
如果我们比较它们,我们得到这个:
edge
函数
他们几乎一样!