Canny Algoritmasi

Makalede, var olan bir image uzerinde bilgisayarli gorme - goruntu isleme konularindan Canny Algoritmasini adim adim calistiricaz. Ayni zamanda algoritme uzerinde; Gaussian, Hysteresis thershold, Non-maxima suppressed ve Gradient yontemlerinin nasil kullanildigi matlab kodlariyla destekliyor olucam.
Varolan armutlu.jpg image'i icin;
Asagidaki ilgili Canny Algoritmasi ile birlikte elimizdeki image goruntusunun kenarlarini bulalim;
Yapmis oldugumuz islemler su sirasiyla su sekildedir; elimizdeki goruntunun oncelikle image'imizi imread ile okutup bunu rgb2gray ile boyutunu azaltmis oluyorum sonrasinda double islemine donusturuyorum. Gaussian ve Hysteresis degerleri icin degiskenler atamalarini gerceklestiriyorum. Image'in konvulasyon degerleri icin gassuian sigma degerini belirleyerek ekrana sigma degerine gore gaussian filtrelemesini bastiriyoruz. Image'in pixel degerleri sayesinde tahmini koseleri belirleyebilmek icin normal yon hesaplaniyor. Buldugumuz pixellere gore yonleri ayiriyoruz. Gradyant yontemi ile bulmus oldugumuz kenarlarin zayif kenar noktalarini non-maxima suppression yontemi ile basitiyoruz. En son olarak Hysteresis thersholding yani ikili esik yontemini kullanarak alt ve ust esiklere gore sonuclari ekrana bastirmis oluyoruz. Matlab kodu ve ekran goruntuleri asagida bulunmaktadir.
Matlab Kodu;
clear all; close all; clc; clf; filtreOlcusu = 5; sigma = 14; dusukEsikDegeri = 0.1; yuksekEsikDegeri = 0.3; image = rgb2gray(imread('armutlu.jpg')); image = double(image); figure(1), imshow(image, []), title('Orjinal Image'); gaussian_filtreleme = fspecial('gaussian', filtreOlcusu, sigma); convulationImage = conv2(image, gaussian_filtreleme, 'same'); figure (2), imshow(convulationImage, []), title(<'gaussian Filterleme="Filterleme" sonucu="sonucu" \sigma="\sigma" ="" ',="'," num2str(sigma)="num2str(sigma)">
);
= gradient(gaussian_filtreleme);
image_gradient_x = conv2(convulationImage, gaussian_filtreleme_x, 'same');
image_gradient_y = conv2(convulationImage, gaussian_filtreleme_y, 'same');
normalYon = atan2(image_gradient_y, image_gradient_x);
normalYon = normalYon*180/pi;
normalYon_dis = zeros(512, 512);
for i = 1 : 512
for j = 1 : 512
if ((normalYon(i, j) > 0 ) && (normalYon(i, j) < 22.5) || (normalYon(i, j) > 157.5) && (normalYon(i, j) < -157.5))
normalYon_dis(i, j) = 0;
end
if ((normalYon(i, j) > 22.5) && (normalYon(i, j) < 67.5) || (normalYon(i, j) < -112.5) && (normalYon(i, j) > -157.5))
normalYon_dis(i, j) = 45;
end
if ((normalYon(i, j) > 67.5 && normalYon(i, j) < 112.5) || (normalYon(i, j) < -67.5 && normalYon(i, j) > 112.5))
normalYon_dis(i, j) = 90;
end
if ((normalYon(i, j) > 112.5 && normalYon(i, j) <= 157.5) || (normalYon(i, j) < -22.5 && normalYon(i, j) > -67.5))
normalYon_dis(i, j) = 135;
end
end
end
figure(3), imshow(image_gradient_x), title('X Gradyan');
figure(4), imshow(image_gradient_y), title('Y Gradyan');
figure(5), imagesc(normalYon_dis); colorbar, title('Normal Yon');
imageGradientMagnitude = sqrt(image_gradient_x.^2 + image_gradient_y.^2);
figure(6), imshow(imageGradientMagnitude, []), title('Gradyan Buyuklugu');
imageSupressed = zeros(512, 512);
for i = 2 : 511
for j = 2 : 511
if (normalYon_dis(i, j) == 0)
if (imageGradientMagnitude(i, j) > imageGradientMagnitude(i, j - 1) && imageGradientMagnitude(i, j) > imageGradientMagnitude(i, j + 1))
imageSupressed(i, j) = imageGradientMagnitude(i, j);
else
imageSupressed(i, j) = 0;
end
end
if (normalYon_dis(i, j) == 45)
if (imageGradientMagnitude(i, j) > imageGradientMagnitude(i + 1, j - 1) && imageGradientMagnitude(i, j) > imageGradientMagnitude(i - 1, j + 1))
imageSupressed(i, j) = imageGradientMagnitude(i, j);
else
imageSupressed(i, j) = 0;
end
end
if (normalYon_dis(i, j) == 90)
if (imageGradientMagnitude(i, j) > imageGradientMagnitude(i - 1, j) && imageGradientMagnitude(i, j) > imageGradientMagnitude(i + 1, j))
imageSupressed(i, j) = imageGradientMagnitude(i, j);
else
imageSupressed(i, j) = 0;
end
end
if (normalYon_dis(i, j) == 135)
if (imageGradientMagnitude(i, j) > imageGradientMagnitude(i - 1, j - 1) && imageGradientMagnitude(i, j) > imageGradientMagnitude(i + 1, j + 1))
imageSupressed(i, j) = imageGradientMagnitude(i, j);
else
imageSupressed(i, j) = 0;
end
end
end
end
figure(7), imshow(imageSupressed), title('Image Non-Maximal Suppression');
thersholdDusukDegeri = dusukEsikDegeri * max(max(imageSupressed));
thersholdYuksekDegeri = yuksekEsikDegeri * max(max(imageSupressed));
imageThreshold = zeros(512, 512);
for i = 1 : 512
for j = 1 : 512
if (imageSupressed(i, j) < thersholdDusukDegeri)
imageThreshold(i, j) = 0;
elseif (imageSupressed(i, j) > thersholdYuksekDegeri)
imageThreshold(i, j) = 1;
else
if ((imageSupressed(i + 1, j) > thersholdYuksekDegeri) || (imageSupressed(i - 1, j) > thersholdYuksekDegeri) || (imageSupressed(i, j + 1) > thersholdYuksekDegeri) || (imageSupressed(i, j - 1) > thersholdYuksekDegeri))
imageThreshold(i, j) = 1;
end
end
end
end
figure(8), imshow(imageThreshold), title('Hysteresis Thresholding');
Ekran Goruntuleri
Keyifli Calismalar Dilerim.



Yorumlar