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

Prewitt operator implementation against MATLAB edge function?

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

因此,当我比较两张图片时:

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

你的掩码除以错误的系数。您通过 sum(abs(b(:)))sum(abs(c(:))) 对每个系数进行归一化,以确保当您使用卷积掩码进行过滤时,输出动态范围与输入相匹配。

在您的情况下,您需要除以 6 而不是 256。这就是为什么与 IPT 在 MATLAB 中提供的对比度相比对比度降低的原因。

根据你之前的 post,我将使用这张图片,因为看起来你使用的是同一张图片:

请注意,因为您没有指定edge的阈值,它会自动计算出来。我实际上设法找到了正确的阈值,它是 0.08995。

因此,试试这个:

%// Read image from Whosebug
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 函数

它们几乎一样!