top of page

Canny Algoritmasi

Yazarın fotoğrafı: Sevdanur GENC
Sevdanur GENC
5 Ara 2013
3 dakikada okunur

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


©2026 by Sevdanur Genc

bottom of page