{"id":144,"date":"2023-12-13T21:19:33","date_gmt":"2023-12-13T18:19:33","guid":{"rendered":"http:\/\/www.cuneytbayrak.com\/?p=144"},"modified":"2025-02-21T00:55:38","modified_gmt":"2025-02-20T21:55:38","slug":"canny-edge-detection-goruntulerin-kenarlarinin-algilanmasi","status":"publish","type":"post","link":"http:\/\/www.cuneytbayrak.com\/?p=144","title":{"rendered":"Canny Edge Detection (G\u00f6r\u00fcnt\u00fclerin Kenarlar\u0131n\u0131n Alg\u0131lanmas\u0131)"},"content":{"rendered":"<p>Canny Edge Detection, g\u00f6r\u00fcnt\u00fclerde kenar alg\u0131lama algoritmalar\u0131 aras\u0131nda en pop\u00fcler olanlar\u0131ndan. John\u00a0 F. Canny denen bir arkada\u015f taraf\u0131ndan geli\u015ftirildi\u011fi i\u00e7in bu ad\u0131 almaktad\u0131r. Olay\u0131n \u00f6z\u00fc; elimizde bir g\u00f6r\u00fcnt\u00fc var ve biz bu g\u00f6r\u00fcnt\u00fc de \u00f6n planda olan nesnenin kenarlar\u0131n\u0131 belirlemek istiyoruz. Nesne \u00f6n plan da de\u011filse ne yapmak laz\u0131m, o da ba\u015fka bir konu. \ud83d\ude42<\/p>\n<p>Canny\u2019nin 4 ana ad\u0131m\u0131 var. Bu d\u00f6rt ad\u0131m\u0131 tek tek uygulayarak sonuca varabiliriz yada OpenCV k\u00fct\u00fcphanesinin\u00a0<strong><em>\u201ccv.Canny()\u201d\u00a0<\/em><\/strong>fonksiyonunu kullanabiliriz. Biz burada \u00f6nce bu d\u00f6rt ad\u0131m\u0131 uygulayarak bir sonu\u00e7 elde edece\u011fiz ve daha sonra k\u00fct\u00fcphaneyi kullanarakta bir sonu\u00e7 elde edip sonu\u00e7lar\u0131 kar\u015f\u0131la\u015ft\u0131raca\u011f\u0131z.<\/p>\n<ol>\n<li>Ad\u0131m: G\u00fcr\u00fclt\u00fc Azaltma (Noise Reduction)<\/li>\n<li>Ad\u0131m: G\u00f6r\u00fcnt\u00fcn\u00fcn Yo\u011funluk Gradyan\u0131n\u0131 Bulma (Finding Intensity Gradient of the Image)<\/li>\n<li>Ad\u0131m: Maksimum Olmayan\u0131 Bast\u0131rma (Non-Maximum Supression)<\/li>\n<li>Ad\u0131m: Histerezis E\u015fi\u011fi Uygulama (Hysteresis Thresholding)<\/li>\n<\/ol>\n<p><strong>G\u00fcr\u00fclt\u00fc Azaltma (Noise Reduction)<\/strong><\/p>\n<p>Canny Kenar alg\u0131lama algoritmas\u0131, g\u00f6r\u00fcnt\u00fclerde ki y\u00fcksek frekansl\u0131 bile\u015fenleri art\u0131ran, d\u00fc\u015f\u00fck olanlar\u0131 ise bast\u0131ran bir algoritmad\u0131r. G\u00f6r\u00fcnt\u00fclerde kenarlar ve g\u00fcr\u00fclt\u00fcler y\u00fcksek frekansl\u0131 b\u00f6lgeler olduklar\u0131 i\u00e7in g\u00fcr\u00fclt\u00fcl\u00fc b\u00f6lgeler y\u00fckselmesin diye al\u00e7ak ge\u00e7iren bir filtre (low pass filter) uygulamak laz\u0131m ilkin. Canny bunun i\u00e7in Gauss filtresi kullanmaktad\u0131r. Genellikle 5\u00d75 lik bir filtre uygulan\u0131r. O zaman \u00f6nce ilgili k\u00fct\u00fcphanelerimizi import edelim, kurulu de\u011filse pip install yapal\u0131m ve kullanaca\u011f\u0131m\u0131z g\u00f6r\u00fcnt\u00fcy\u00fc y\u00fckleyip g\u00fcr\u00fclt\u00fc azaltma i\u015flemini uygulayal\u0131m.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-145\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/muhali-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/muhali-300x300.jpg 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/muhali-150x150.jpg 150w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/muhali.jpg 626w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>&nbsp;<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">import cv2 as cv\r\nimport numpy as np\r\n \r\nimg=cv.imread(r'C:\\Users\\GB0002\\Desktop\\muhali.JPG')\r\n \r\nimg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)\r\n \r\nimg2=cv.GaussianBlur(img, (5,5), 0)\r\n\r\ncv.imshow(\"Gaussian\", img2)\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<\/div>\n<p>Kodlarda g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi g\u00f6r\u00fcnt\u00fcy\u00fc y\u00fckledik, gray yapt\u0131k ve ard\u0131ndan 5\u00d75 Gauss Al\u00e7ak Ge\u00e7iren filtresi uygulad\u0131k. Sonu\u00e7lar \u015f\u00f6yle;<\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-146\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage-300x156.jpg\" alt=\"\" width=\"577\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage-300x156.jpg 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage-1024x533.jpg 1024w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage-768x400.jpg 768w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/orggaussianimage.jpg 1280w\" sizes=\"auto, (max-width: 577px) 100vw, 577px\" \/><\/a><\/p>\n<p><strong>G\u00f6r\u00fcnt\u00fcn\u00fcn Yo\u011funluk Gradyan\u0131n\u0131 Bulma (Finding Intensity Gradient of the Image)<\/strong><\/p>\n<p>Bu ad\u0131mda g\u00f6r\u00fcnt\u00fcn\u00fcn gradyan\u0131n\u0131 hesaplayarak kenarlar\u0131n yo\u011funlu\u011funu ve y\u00f6n\u00fcn\u00fc tespit edece\u011fiz. Yani kenar tespiti ilk bu ad\u0131mda ger\u00e7ekle\u015ftirilmi\u015f olacak. Bildi\u011fimiz gibi kenarlar piksel yo\u011funlu\u011funun ani de\u011fi\u015fimlerine kar\u015f\u0131l\u0131k gelir ve bunu tespit etmenin en kolay yolu, g\u00f6r\u00fcnt\u00fcye x ve y y\u00f6n\u00fcnde filtreler uygulamakt\u0131r. Bunun i\u00e7in Canny Algoritmas\u0131, x ve y y\u00f6n\u00fcnde sobel filtresini g\u00f6r\u00fcnt\u00fcyle konv\u00fcle etmektedir. Sobel hem yatay hem de dikey y\u00f6nde ki gradyanlar\u0131 bulur. Kenarlar gradyan y\u00f6n\u00fcne dik oldu\u011fundan, bu gradyanlar\u0131 kullanarak her piksel i\u00e7in kenar gradyan\u0131n\u0131 ve y\u00f6n\u00fcn\u00fc bulmaya \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<p>Kx ve Ky gibi iki adet Sobel Kernel\u2019i olu\u015fturup bunu Gaussian Low Pass Filter etti\u011fimiz g\u00f6r\u00fcnt\u00fc ile konv\u00fcle edece\u011fiz.<\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/kernels_sobel.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-147 size-medium\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/kernels_sobel-300x82.png\" alt=\"\" width=\"300\" height=\"82\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/kernels_sobel-300x82.png 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/kernels_sobel.png 392w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Konv\u00fcl\u00fcsyon sonucu olu\u015fan Ix ve Iy\u2019nin karelerinin toplam\u0131n\u0131n karek\u00f6k\u00fc bize kenar gradyan\u0131n\u0131 (magnitude) verecek. Ayr\u0131ca Iy\u2019nin Ix\u2019e oran\u0131n\u0131n arctan de\u011feri de bize kenar y\u00f6n\u00fcn\u00fc (direction) verecek.<\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_sobel.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-148\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_sobel.png\" alt=\"\" width=\"220\" height=\"115\" \/><\/a><\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">Kx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], np.float32)\r\nKy = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], np.float32)\r\nIx = cv.filter2D(img2, ddepth=-1, kernel=Kx)\r\nIy = cv.filter2D(img2, ddepth=-1, kernel=Ky)\r\n \r\nG = np.hypot(Ix, Iy)\r\nG = G \/ G.max() * 255\r\ntheta = np.arctan2(Iy, Ix)\r\n \r\nimg3=np.uint8(G)<\/pre>\n<\/div>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-149\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage-300x157.jpg\" alt=\"\" width=\"575\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage-300x157.jpg 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage-1024x534.jpg 1024w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage-768x401.jpg 768w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gaussiangradientmagnitudeimage.jpg 1280w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/a><\/p>\n<p><strong>Maksimum Olmayan\u0131 Bast\u0131rma (Non-Maximum Supression)<\/strong><\/p>\n<p>Yukar\u0131da ki g\u00f6r\u00fcnt\u00fclerde g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi kenarlar hala olduk\u00e7a bulan\u0131k ve kal\u0131n. Bu nedenle kenarlar\u0131 inceltmemiz ya da ba\u015fka bir deyi\u015fle en b\u00fcy\u00fck kenar\u0131 bulmam\u0131z gerekir. Bu, Maksimum Olmayan Bast\u0131rma (Non-Maximum Supression) kullan\u0131larak yap\u0131l\u0131r. Bunu yapman\u0131n yolu; her piksel i\u00e7in kom\u015fu pikselleri yatay, dikey ve diyagonal y\u00f6nlerde (0\u00b0, 45\u00b0, 90\u00b0 ve 135\u00b0) bulup her pikseldeki gradyan y\u00f6n\u00fcn\u00fc de a\u015fa\u011f\u0131da g\u00f6sterildi\u011fi gibi bu y\u00f6nlerden birine yuvarlamam\u0131z gerekir.<\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Grad_direc-2.webp\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-150 size-full\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Grad_direc-2.webp\" alt=\"\" width=\"713\" height=\"341\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Grad_direc-2.webp 713w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Grad_direc-2-300x143.webp 300w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_direc-1.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-151 size-full\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_direc-1.webp\" alt=\"\" width=\"641\" height=\"211\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_direc-1.webp 641w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/grad_direc-1-300x99.webp 300w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/a><\/p>\n<p>Yuvarlamadan sonra, her piksel de\u011ferini gradyan y\u00f6n\u00fcndeki iki kom\u015fu pikselle bir d\u00f6ng\u00fc yard\u0131m\u0131 ile kar\u015f\u0131la\u015ft\u0131raca\u011f\u0131z. E\u011fer bu piksel yerel bir maksimum ise, kenar pikseli olarak kalacak aksi takdirde bast\u0131r\u0131lacak. B\u00f6yle yaparak sadece en b\u00fcy\u00fck de\u011ferleri elde etmi\u015f olaca\u011f\u0131z.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">M, N = G.shape\r\nZ = np.zeros((M, N), dtype=np.int32)\r\nangle = theta * 180. \/ np.pi\r\nangle[angle &lt; 0] += 180\r\n\r\nfor i in range(1, M - 1):\r\n    for j in range(1, N - 1):\r\n        try:\r\n            q = 255\r\n            r = 255\r\n\r\n            # angle 0\r\n            if (0 &lt;= angle[i, j] &lt; 22.5) or (157.5 &lt;= angle[i, j] &lt;= 180):\r\n                q = G[i, j + 1]\r\n                r = G[i, j - 1]\r\n            # angle 45\r\n            elif (22.5 &lt;= angle[i, j] &lt; 67.5):\r\n                q = G[i + 1, j - 1]\r\n                r = G[i - 1, j + 1]\r\n            # angle 90\r\n            elif (67.5 &lt;= angle[i, j] &lt; 112.5):\r\n                q = G[i + 1, j]\r\n                r = G[i - 1, j]\r\n            # angle 135\r\n            elif (112.5 &lt;= angle[i, j] &lt; 157.5):\r\n                q = G[i - 1, j - 1]\r\n                r = G[i + 1, j + 1]\r\n\r\n            if (G[i, j] &gt;= q) and (G[i, j] &gt;= r):\r\n                Z[i, j] = G[i, j]\r\n            else:\r\n                Z[i, j] = 0\r\n\r\n        except IndexError as e:\r\n            pass\r\n\r\nimg4 = np.uint8(Z)\r\n<\/pre>\n<\/div>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-152\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage-300x157.jpg\" alt=\"\" width=\"575\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage-300x157.jpg 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage-1024x534.jpg 1024w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage-768x401.jpg 768w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/gradientmagnitudenonmaxsupressionimage.jpg 1280w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi daha ince kenarlara sahip bir g\u00f6r\u00fcnt\u00fc elde etmi\u015f olduk. Fakat dikkat ettiyseniz baz\u0131 kenarlar di\u011ferlerine g\u00f6re daha parlak g\u00f6z\u00fck\u00fcyor. Bunu da gidermek i\u00e7in son bir ad\u0131m olarak Histerezis E\u015fi\u011fi Uygulayaca\u011f\u0131z (Hysteresis Thresholding).<\/p>\n<p><strong>Histerezis E\u015fi\u011fi Uygulama (Hysteresis Thresholding)<\/strong><\/p>\n<p>Maksimum olmayan\u0131 bast\u0131rma, g\u00f6r\u00fcnt\u00fcn\u00fcn ger\u00e7ek kenarlar\u0131n\u0131 daha do\u011fruya yak\u0131n bir \u015fekilde \u00e7\u0131karm\u0131\u015f oldu. Ancak belirtti\u011fimiz gibi baz\u0131 kenarlar di\u011ferlerinden daha parlak. Daha parlak olanlar g\u00fc\u00e7l\u00fc kenarlar olabilir yada g\u00fcr\u00fclt\u00fc de olabilir. Canny, hangi kenarlar\u0131n ger\u00e7ekten kenar oldu\u011fu ve hangilerinin olmad\u0131\u011f\u0131 sorununu \u00e7\u00f6zmek i\u00e7in Histerezis e\u015fiklemeyi kullan\u0131r. Bu y\u00f6ntemde,\u00a0<strong><em>\u2018Y\u00fcksek\u2019<\/em><\/strong>\u00a0ve\u00a0<strong><em>\u2018D\u00fc\u015f\u00fck\u2019<\/em><\/strong>\u00a0olmak \u00fczere iki e\u015fik de\u011feri belirleriz. Yo\u011funlu\u011fu, belirledi\u011fimiz\u00a0<strong><em>\u2018Y\u00fcksek\u2019<\/em><\/strong>\u00a0 e\u015fikten b\u00fcy\u00fck olan t\u00fcm kenarlar kesin kenarlard\u0131r. Yo\u011funlu\u011fu,\u00a0<strong><em>\u2018D\u00fc\u015f\u00fck\u2019\u00a0<\/em><\/strong>e\u015fikten az olan t\u00fcm kenarlar\u0131n ise kenar olmad\u0131\u011f\u0131ndan emin oluruz.\u00a0<strong><em>\u2018Y\u00fcksek\u2019<\/em><\/strong>\u00a0ve\u00a0<strong><em>\u2018D\u00fc\u015f\u00fck\u2019<\/em><\/strong>\u00a0e\u015fikleri aras\u0131ndaki kenarlar ise yaln\u0131zca kesin bir kenara ba\u011fl\u0131ysa kenar olarak s\u0131n\u0131fland\u0131r\u0131l\u0131r, aksi takdirde kenar olmad\u0131\u011f\u0131na karar verilir. Anlamak i\u00e7in bir \u00f6rnek verelim.<\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Hysteresis-2.webp\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-154 size-full\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Hysteresis-2.webp\" alt=\"\" width=\"379\" height=\"278\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Hysteresis-2.webp 379w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/Hysteresis-2-300x220.webp 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/a><\/p>\n<p>Burada, A ve B\u00a0<em><strong>\u2018Y\u00fcksek\u2019<\/strong><\/em> e\u015fi\u011finin \u00fczerinde olduklar\u0131 i\u00e7in kesin kenarlard\u0131r. Benzer \u015fekilde, D kesin olmayan bir kenard\u0131r. Hem E hem de C zay\u0131f kenarlard\u0131r ancak C kesin kenar olan B\u2019ye ba\u011fl\u0131 oldu\u011fu i\u00e7in C de g\u00fc\u00e7l\u00fc kenar olarak kabul edilir. Ayn\u0131 mant\u0131kla E de at\u0131l\u0131r. Bu \u015fekilde g\u00f6r\u00fcnt\u00fcde sadece g\u00fc\u00e7l\u00fc kenarlar elde edilmi\u015f olur. Burada \u015fu varsay\u0131m\u0131 g\u00f6z ard\u0131 etmemek laz\u0131m; kenarlar\u0131n uzun \u00e7izgiler oldu\u011fu varsay\u0131l\u0131r.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">y\u00fcksekesik = 40\r\ndusukesik = 20\r\n\r\nM, N = img4.shape\r\nout = np.zeros((M, N), dtype=np.uint8)\r\n\r\nstrong_i, strong_j = np.where(img4 &gt;= y\u00fcksekesik)\r\nzeros_i, zeros_j = np.where(img4 &lt; dusukesik)\r\n\r\nweak_i, weak_j = np.where((img4 &lt;= y\u00fcksekesik) &amp; (img4 &gt;= dusukesik))\r\n\r\nout[strong_i, strong_j] = 255\r\nout[zeros_i, zeros_j] = 0\r\nout[weak_i, weak_j] = 75\r\n\r\nM, N = out.shape\r\nfor i in range(1, M - 1):\r\n    for j in range(1, N - 1):\r\n        if out[i, j] == 75:\r\n            if 255 in [out[i + 1, j - 1], out[i + 1, j], out[i + 1, j + 1], \r\n                       out[i, j - 1], out[i, j + 1], \r\n                       out[i - 1, j - 1], out[i - 1, j], out[i - 1, j + 1]]:\r\n                out[i, j] = 255\r\n            else:\r\n                out[i, j] = 0<\/pre>\n<\/div>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-156 size-medium\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage-286x300.jpg\" alt=\"\" width=\"286\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage-286x300.jpg 286w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage.jpg 686w\" sizes=\"auto, (max-width: 286px) 100vw, 286px\" \/><\/a><\/p>\n<p>Ba\u015fta belirtti\u011fim gibi t\u00fcm bu i\u015flemleri tek bir sat\u0131r kod ile OpenCV k\u00fct\u00fcphanesinin cv.Canny() metodu ile de yapabilmekteyiz. Ancak bu metodun arka plan\u0131nda neler d\u00f6n\u00fcyor anlamak ad\u0131na b\u00f6yle bir yaz\u0131 kaleme alm\u0131\u015f olduk. \u015eimdi bu metod ile de bir sonu\u00e7 elde edelim ve iki sonucu kar\u015f\u0131la\u015ft\u0131ral\u0131m.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">import cv2 as cv\r\nimport numpy as np\r\n \r\nimg=cv.imread(r'C:\\Users\\GB0002\\Desktop\\muhali.JPG')\r\n \r\nimg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)\r\n \r\nimg2=cv.Canny(img,100,200,L2gradient=True)\r\n \r\ncv.imshow('Final Image2', img2)\r\ncv.waitKey()<\/pre>\n<\/div>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage2.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-158 size-medium\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage2-286x300.jpg\" alt=\"\" width=\"286\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage2-286x300.jpg 286w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimage2.jpg 686w\" sizes=\"auto, (max-width: 286px) 100vw, 286px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-scaled.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-159\" src=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-300x157.jpg\" alt=\"\" width=\"572\" height=\"300\" srcset=\"http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-300x157.jpg 300w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-1024x537.jpg 1024w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-768x403.jpg 768w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-1536x806.jpg 1536w, http:\/\/www.cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/finalimagecompare-2048x1075.jpg 2048w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a><\/p>\n<p>Sonu\u00e7lar\u0131n biraz farkl\u0131 \u00e7\u0131kmas\u0131 y\u00fcksek ve d\u00fc\u015f\u00fck e\u015fik de\u011ferlerinin farkl\u0131 olmas\u0131ndan kaynakland\u0131.<\/p>\n<p>Umar\u0131m bu yaz\u0131 Canny Kenar Alg\u0131lama algoritmas\u0131n\u0131 biraz olsun anlamam\u0131za yard\u0131mc\u0131 olmu\u015ftur.<\/p>\n<p>Kodlar\u0131n tamam\u0131n\u0131\u00a0<a href=\"http:\/\/cuneytbayrak.com\/wp-content\/uploads\/2025\/02\/canny_edge_detection.rar\">buradan<\/a>\u00a0indirebilirsiniz.<\/p>\n<p>Kolay gele&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Canny Edge Detection, g\u00f6r\u00fcnt\u00fclerde kenar alg\u0131lama algoritmalar\u0131 aras\u0131nda en pop\u00fcler olanlar\u0131ndan. John\u00a0 F. Canny denen bir arkada\u015f taraf\u0131ndan geli\u015ftirildi\u011fi i\u00e7in bu ad\u0131 almaktad\u0131r. Olay\u0131n \u00f6z\u00fc; elimizde bir g\u00f6r\u00fcnt\u00fc var ve&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"http:\/\/www.cuneytbayrak.com\/?p=144\">Devam\u0131n\u0131 Oku<span class=\"screen-reader-text\">Canny Edge Detection (G\u00f6r\u00fcnt\u00fclerin Kenarlar\u0131n\u0131n Alg\u0131lanmas\u0131)<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":9,"footnotes":""},"categories":[8],"tags":[39],"class_list":["post-144","post","type-post","status-publish","format-standard","hentry","category-sayisal-goruntu-isleme","tag-cannyedgedetection","excerpt"],"_links":{"self":[{"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/posts\/144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=144"}],"version-history":[{"count":4,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":160,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions\/160"}],"wp:attachment":[{"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.cuneytbayrak.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}