针对 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
函数
它们几乎一样!
使用 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
函数
它们几乎一样!