612 views (last 30 days)

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

David Wilson
on 12 Sep 2019

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:

Nisreen Sulayman
on 12 Sep 2019

Bruno Luong
on 12 Sep 2019

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

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.