首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这个MATLAB Prewitt操作符实现中有什么问题?

在这个MATLAB Prewitt操作符实现中有什么问题?
EN

Stack Overflow用户
提问于 2015-07-02 11:38:56
回答 2查看 209关注 0票数 3

我试图为边缘检测编写Prewitt操作符的实现。到目前为止,我已经尝试过:

代码语言:javascript
复制
openImage = im2double(rgb2gray(imread(imageSource)));
[rows,cols] =  size(openImage);

N(1:rows,1:cols)=0;
for i=1:rows-2;
    for j=1:rows-2;
        N(i,j)=-1*openImage(i,j)-1*openImage(i,j+1)-1*openImage(i,j+2)+0+0+0+1*openImage(i+2,j)+1*openImage(i+2,j+1)+1*openImage(i+2,j+2);
    end;
end;
O(1:rows,1:cols)=0;
for i=1:rows-2;
    for j=1:rows-2;
        O(i,j)=-1*openImage(i,j)+0+1*openImage(i,j+2)-1*openImage(i+2,j)+0+1*openImage(i+1,j+2)-1*openImage(i+2,j)+0+1*openImage(i+2,j+2);
    end
end
Z = N + O;

为此,我可以获得:

可以看到,该图像得到了一半的图像处理和半空白。我做错了什么?

这是原始图像:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-02 12:26:21

考虑以下代码:

代码语言:javascript
复制
I = im2double(rgb2gray(..));
[rows,cols] =  size(I);

N = zeros(size(I));
for i=2:rows-1;
    for j=2:cols-1;
        N(i,j) = 1*I(i-1,j-1) +  1*I(i-1,j) +  1*I(i-1,j+1) + ...
                 0            +  0          +  0            + ...
                -1*I(i+1,j-1) + -1*I(i+1,j) + -1*I(i+1,j+1);
    end
end

O = zeros(size(I));
for i=2:rows-1;
    for j=2:cols-1;
        O(i,j) = 1*I(i-1,j-1) + 0 + -1*I(i-1,j+1) + ...
                 1*I(i,j-1)   + 0 + -1*I(i,j+1)   + ...
                 1*I(i+1,j-1) + 0 + -1*I(i+1,j+1);
    end
end

Z = sqrt(N.^2 + O.^2);
imshow(Z)

然后比较一下到:

代码语言:javascript
复制
Gx = conv2(I, [-1 0 1; -1 0 1; -1 0 1]);
Gy = conv2(I, [-1 -1 -1; 0 0 0; 1 1 1]);

G = sqrt(Gx.^2 + Gy.^2);
T = atan2(Gy, Gx);

imshow(G)

注意,您可能必须使用imshow(result,[])来正确地显示0,1值范围之外的结果。

票数 3
EN

Stack Overflow用户

发布于 2015-07-02 12:03:38

代码语言:javascript
复制
for j=1:rows-2;

必须是

代码语言:javascript
复制
for j=1:cols-2;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31183602

复制
相关文章

相似问题

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