首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对MATLAB边缘函数的Prewitt算子实现?

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

Stack Overflow用户
提问于 2015-07-02 23:21:05
回答 1查看 5.3K关注 0票数 0

使用conv2,我实现了Prewitt算子的边缘检测。这就是我想要的:

代码语言:javascript
复制
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的实现进行比较

代码语言:javascript
复制
edge(openImage,'Prewitt', [], 'both', 'nothinning');

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

因此,正如我们所看到的,它们并不完全相同,但是我很确定它们的实现。原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 02:07:06

你的面具被错误的系数隔开了。通过sum(abs(b(:)))sum(abs(c(:)))对每个系数进行规范化,以确保使用卷积掩码进行滤波时,输出动态范围与输入匹配。

在你的例子中,你需要除以6而不是256。这就是为什么与IPT在MATLAB中给你的东西相比,你有一个减少的对比。

从您上一篇文章中,我将使用这个图像,因为它看起来您使用的是同一张:

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

因此,尝试如下:

代码语言:javascript
复制
%// 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函数

他们差不多一样!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31196166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档