q = imread('circuit.tif');
q_output1 = imgaussfilt(q,1.5);
Canny_Prewitt_KernalX = [-1 0 1;-1 0 1;-1 0 1];
Canny_Prewitt_KernalY = Canny_Prewitt_KernalX';
Canny_Sobel_KernalX = [-1 0 1;-2 0 2;-1 0 1];
Canny_Sobel_KernalY = -Canny_Sobel_KernalX';
Canny_Prewitt_FiltX = filter2(Canny_Prewitt_KernalX,q_output1,'same');
Canny_Prewitt_FiltY = filter2(Canny_Prewitt_KernalY,q_output1,'same');
Canny_Prewitt_Edge = sqrt(Canny_Prewitt_FiltX.^2 + Canny_Prewitt_FiltY.^2);
Canny_Sobel_FiltX = filter2(Canny_Sobel_KernalX,q_output1,'same');
Canny_Sobel_FiltY = filter2(Canny_Sobel_KernalY,q_output1,'same');
Canny_Sobel_Edge = sqrt(Canny_Sobel_FiltX.^2 + Canny_Sobel_FiltY.^2);
Canny_Prewitt_Theta = atan2(Canny_Prewitt_FiltY,Canny_Prewitt_FiltX).*(180/pi);
Canny_Sobel_Theta = atan2(Canny_Sobel_FiltY,Canny_Sobel_FiltX).*(180/pi);
Canny_Prewitt_Theta(isnan(Canny_Prewitt_Theta)) = 0;
Canny_Sobel_Theta(isnan(Canny_Sobel_Theta)) = 0;
rows = size(Canny_Prewitt_Theta,1);
columns = size(Canny_Sobel_Theta,2);
for i = 1:rows
for j = 1:columns
if Canny_Prewitt_Theta(i,j) < 0
Canny_Prewitt_Theta(i,j) = Canny_Prewitt_Theta(i,j) + 180;
elseif Canny_Sobel_Theta(i,j) < 0
Canny_Sobel_Theta(i,j) = Canny_Sobel_Theta(i,j) +180;
elseif Canny_Prewitt_Theta(i,j) < 0 && Canny_Sobel_Theta(i,j) < 0
Canny_Prewitt_Theta(i,j) = Canny_Prewitt_Theta(i,j) + 180;
Canny_Sobel_Theta(i,j) = Canny_Sobel_Theta(i,j) +180;
end
end
end
Canny_BW_Prewitt_Edge = imbinarize(Canny_Prewitt_Edge/255,0.3);
Canny_BW_Sobel_Edge = imbinarize(Canny_Sobel_Edge/255,0.3);
rows = size(Canny_Prewitt_Theta,1);
columns = size(Canny_Sobel_Theta,2);
for i = 2:rows-1
for j = 2:columns-1
Prewitt_Result = [1 2 3 4 5].*...
[Canny_Prewitt_Theta(i,j) < 22.5,...
Canny_Prewitt_Theta(i,j) >= 22.5 && Canny_Prewitt_Theta(i,j) < 67.5,...
Canny_Prewitt_Theta(i,j) >= 67.5 && Canny_Prewitt_Theta(i,j) < 112.5,...
Canny_Prewitt_Theta(i,j) >= 112.5 && Canny_Prewitt_Theta(i,j) < 157.5,...
Canny_Prewitt_Theta(i,j) >= 157.5 && Canny_Prewitt_Theta(i,j) <= 180];
switch Prewitt_Result(Prewitt_Result~=0)
case 1
if Canny_Prewitt_Edge(i,j-1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
elseif Canny_Prewitt_Edge(i,j+1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
end
case 2
if Canny_Prewitt_Edge(i-1,j+1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
elseif Canny_Prewitt_Edge(i+1,j-1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
end
case 3
if Canny_Prewitt_Edge(i-1,j) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
elseif Canny_Prewitt_Edge(i+1,j) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
end
case 4
if Canny_Prewitt_Edge(i-1,j-1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
elseif Canny_Prewitt_Edge(i+1,j+1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
end
case 5
if Canny_Prewitt_Edge(i,j-1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
elseif Canny_Prewitt_Edge(i,j+1) > Canny_Prewitt_Edge(i,j)
Canny_Prewitt_Edge(i,j) = 0;
end
end
Sobel_Result = [1 2 3 4 5].*...
[Canny_Sobel_Theta(i,j) < 22.5,...
Canny_Sobel_Theta(i,j) >= 22.5 && Canny_Sobel_Theta(i,j) < 67.5,...
Canny_Sobel_Theta(i,j) >= 67.5 && Canny_Sobel_Theta(i,j) < 112.5,...
Canny_Sobel_Theta(i,j) >= 112.5 && Canny_Sobel_Theta(i,j) < 157.5,...
Canny_Sobel_Theta(i,j) >= 157.5 && Canny_Sobel_Theta(i,j) <= 180];
switch Sobel_Result(Sobel_Result~=0)
case 1
if Canny_Sobel_Edge(i,j-1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
elseif Canny_Sobel_Edge(i,j+1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
end
case 2
if Canny_Sobel_Edge(i-1,j+1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
elseif Canny_Sobel_Edge(i+1,j-1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
end
case 3
if Canny_Sobel_Edge(i-1,j) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
elseif Canny_Sobel_Edge(i+1,j) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
end
case 4
if Canny_Sobel_Edge(i-1,j-1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
elseif Canny_Sobel_Edge(i+1,j+1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
end
case 5
if Canny_Sobel_Edge(i,j-1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
elseif Canny_Sobel_Edge(i,j+1) > Canny_Sobel_Edge(i,j)
Canny_Sobel_Edge(i,j) = 0;
end
end
end
end
Canny_Prewitt_Edge(1,:) = 0;
Canny_Prewitt_Edge(max(rows),:) = 0;
Canny_Prewitt_Edge(:,1) = 0;
Canny_Prewitt_Edge(:,max(columns)) = 0;
Canny_Sobel_Edge(1,:) = 0;
Canny_Sobel_Edge(max(rows),:) = 0;
Canny_Sobel_Edge(:,1) = 0;
Canny_Sobel_Edge(:,max(columns)) = 0;
figure(34)
imshowpair(Canny_Prewitt_Edge,Canny_Sobel_Edge,'montage','Scaling','none');title('Non-Max Suppression');
figure(35)
subplot(121),imshow(Canny_Prewitt_Edge,colormap('gray'));shtitle('Non-Max Suppression');title('Canny using Prewitt');
subplot(122),imshow(Canny_Sobel_Edge,colormap('gray'));title('Canny using Sobel');