针对MATLAB边缘函数的Prewitt算子实现?

时间:2015-07-02 23:21:05

标签: matlab image-processing edge-detection

使用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');

所以,当我比较两个图像时:

enter image description here

因为可以看出它们并不完全相同,但我对实施非常肯定。这是什么原因?

1 个答案:

答案 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');

如果我们比较它们,我们得到这个:

从您的代码

enter image description here

来自MATLAB的edge函数

enter image description here

他们几乎一样!