MATLAB Answers

2D Convolution - Sobel Filter. What is wrong?

609 ビュー (過去 30 日間)
Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 11 日
コメント済み: Nisreen Sulayman 2019 年 9 月 20 日
img = imread('Davis_Hall.jpg');
% 'Davis_Hall.jpg':color image
img =double(rgb2gray(img));
Gx = double([-1 0 1;-2 0 2;-1 0 1]);
Gx=rot90(Gx,2);
Gy = double([-1 -2 -1; 0 0 0; 1 2 1]);
Gy=rot90(Gy,2);
I= img;
[r,c]=size(I);
Fx = zeros(r,c);
Fy = zeros(r,c);
I = padarray(I,[1 1]);
for i=2:r-1
for j=2:c-1
Fx(i,j)=sum(sum(Gx.*I(i-1:i+1,j-1:j+1)));
Fy(i,j)=sum(sum(Gy.*I(i-1:i+1,j-1:j+1)));
end
end
img=uint8(img);
FMag=sqrt(Fx.^2+Fy.^2);
figure(1)
imshow(img);
title('Original Image');
figure(2)
imshow((abs(Fx))./max(max(Fx)));
title('Gradient in X direction');
figure(3)
imshow(abs(Fy)./max(max(Fy)));
title('Gradient in Y direction');
figure(4)
imshow(FMag./max(max(FMag)));
title('Gradient Magnitude');
% IT IS Not Allowed to use: imfilter, conv2, filter2, conv

  0 件のコメント

サインインしてコメントする。

回答 (2 件)

David Wilson
David Wilson 2019 年 9 月 12 日
Here's my (old) code for a sobel filter:
img = imread('Davis_Hall.jpg');
% 'Davis_Hall.jpg':color image
X =double(rgb2gray(img));
%% Start
Bx = [-1,0,1;-2,0,2;-1,0,1]; % Sobel Gx kernel
By = Bx'; % gradient Gy
Yx = filter2(Bx,X); % convolve in 2d
Yy = filter2(By,X);
G = sqrt(Yy.^2 + Yx.^2); % Find magnitude
Gmin = min(min(G)); dx = max(max(G)) - Gmin; % find range
G = floor((G-Gmin)/dx*255); % normalise from 0 to 255
image(G); axis('image')
colormap gray
Gives the following: DavisH.png

  3 件のコメント

Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 12 日
IT IS Not Allowed to use: imfilter, conv2, filter2, conv
David Wilson
David Wilson 2019 年 9 月 12 日
Ah, then this is homework?
Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 12 日
It is a graded excercise\online course.

サインインしてコメントする。


Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 12 日
Here is my results:
untitled.jpg

  10 件のコメント

表示 7 件の古いコメント
Bruno Luong
Bruno Luong 2019 年 9 月 12 日
The second error I spot is the way you deal with padding and boundary
IMO the loop and padding should be (not tested)
[r,c]=size(I);
Fx = zeros(r,c);
Fy = zeros(r,c);
I = padarray(I,[1 1],'replicate'); % lass abrute than 0
for i=1:r
for j=1:c
Fx(i,j)=sum(sum(Gx.*I(i:i+2,j:j+2)));
Fy(i,j)=sum(sum(Gy.*I(i:i+2,j:j+2)));
end
end
Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 13 日
Didn't work!!
Maybe there is something wrong related to the "greader"
We have a good results ... still didn't accept the answer!! (even with first code I have a good results!!)
OR THERE is that kind of silly bug which I couldn't spot.
Nisreen Sulayman
Nisreen Sulayman 2019 年 9 月 20 日
How to normalize a convolved image?
I have got these messages after running
%read the image
img = imread('Davis_Hall.jpg');
I =double(rgb2gray(img));
%Gx = double([-1 0 1;-2 0 2;-1 0 1]);
Gx=[-1 0 1;-2 0 2;-1 0 1];
Gx=rot90(Gx,2);
%Gy = double([-1 -2 -1; 0 0 0; 1 2 1]);
Gy=[-1 -2 -1; 0 0 0;1 2 1];
Gy=rot90(Gy,2);
[r,c]=size(I);
Fx = zeros(r,c);
Fy = zeros(r,c);
FMag=zeros(r,c);
I = padarray(I,[1 1],0,'both');
for i=2:r-1
for j=2:c-1
Fx(i,j)=sum(sum(Gx.*I(i-1:i+1,j-1:j+1)));
Fy(i,j)=sum(sum(Gy.*I(i-1:i+1,j-1:j+1)));
FMag(i,j)=sqrt(power(Fx(i,j),2)+power(Fy(i,j),2));
end
end
Fx=Fx(2:r-1,2:c-1);
Fy=Fy(2:r-1,2:c-1);
FMag=FMag(2:r-1,2:c-1);
img=uint8(img);
figure(1)
imshow(img);
title('Original Image');
figure(2)
imshow((abs(Fx))./max(max(Fx)));
title('Gradient in X direction');
figure(3)
imshow(abs(Fy)./max(max(Fy)));
title('Gradient in Y direction');
figure(4)
imshow(FMag./max(max(FMag)));
title('Gradient Magnitude');
%Fx may have negative values and values which are greater than 255, hence normalize before visualiz
%Fy may have negative values and values which are greater than 255, hence normalize before visualizin
%FMag may have values which are greater than 255, hence normalize before visualizing

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by