这个 MATLAB Prewitt 运算符实现有什么问题?
What's the issue in this MATLAB Prewitt operator implementation?
我正在尝试编写用于边缘检测的 Prewitt 算子的实现。到目前为止我已经尝试过:
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;
为此我可以获得:
可以看出,该图像处理了一半图像,一半空白。我做错了什么?
这是原始图片:
for j=1:rows-2;
必须
for j=1:cols-2;
考虑以下代码:
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)
然后 compare it 到:
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] 值范围之外的结果。
我正在尝试编写用于边缘检测的 Prewitt 算子的实现。到目前为止我已经尝试过:
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;
为此我可以获得:
可以看出,该图像处理了一半图像,一半空白。我做错了什么?
这是原始图片:
for j=1:rows-2;
必须
for j=1:cols-2;
考虑以下代码:
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)
然后 compare it 到:
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] 值范围之外的结果。