使用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');所以,当我比较这两幅图像时:

因此,正如我们所看到的,它们并不完全相同,但是我很确定它们的实现。原因是什么?
发布于 2015-07-03 02:07:06
你的面具被错误的系数隔开了。通过sum(abs(b(:)))或sum(abs(c(:)))对每个系数进行规范化,以确保使用卷积掩码进行滤波时,输出动态范围与输入匹配。
在你的例子中,你需要除以6而不是256。这就是为什么与IPT在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');如果我们将两者进行比较,我们就会得到以下结论:
从你的代码

从MATLAB的edge函数

他们差不多一样!
https://stackoverflow.com/questions/31196166
复制相似问题