2D Convolution

Abdulsamet İLERİ
4 min readAug 26, 2018

Bu yazımızda sinyal ve görüntü işlemede kullanılan en önemli işlemlerden biri olan convolution inceleyeceğiz.

Bilindiği üzere, Convolution, 1D’de (konuşma işlemede), 2D’de (görüntü işlemede) veya 3D’de (video işlemede) çalışabilir. Bu yazımızda, çoğunlukla görüntü işleme alanında feature extraction (ham piksel değerlerini, daha anlamlı ve yararlı bilgilere dönüştürme işlemi) için kullanılan ve aynı zamanda Convolutional Neural Networks (CNNs) temel bloğu sayılan 2D Convolution üzerinde duracağız.

Öncelikle, bir görüntüyü elemanları 0 ile 255 arasında değişen bir matris olarak düşünebiliriz. Bu matrisin boyutu (görüntü yüksekliği) x (görüntü genişliği) x (görüntü kanal sayısı) olarak ifade edilir. Gri tonlamalı bir görüntünün kanal (channel) sayısı 1 iken, renkli bir görüntünün (RGB) kanalı sayısı 3'tür.

Örnek bir RGB Resim

Bundan dolayı, Her 2D renkli görüntüyü, her biri ayrı renk kodu içeren 3 gri tonlamalı görüntüden oluşan bir kombinasyon şeklinde gösterebiliriz.

Biraz daha detaylı incelersek,

Örnek bir RGB Array

Bir RGB arrayini şekildeki gibi uzayda 3 düzlemin birleşimiyle oluşan bir multidimensional array olarak düşünebiliriz. Yukarıda RGB’de her piksel için 0 ile 255 arası değer alındığını söylemiştik. Burda bu kural ihmal edilmiş gibi gözükebilir fakat yapılan işlem 0 ile 255 arası değer alan hücreleri 255 ile bölerek 0 ile 1 arasında mapping yapmak. Burda 0.0 (0x00), 1.0 (0xFF) anlamındadır. Ayrıca daha sonraki yazılarımızda RGB[:,:,1] şeklinde kırmızı düzleme, RGB[:,:,2] şeklinde yeşil düzleme, RGB[:,:,3] şeklinde mavi düzleme erişerek değerlerlerle oynayacağız.

Ekstra bilgi verdikten sonra konumuza geri dönelim. Convolution ile her piksele bir matematiksel operatör uygular, değerlerinde oynama yaparız. Bu matematiksel operatöründe uygulanması, kernel olarak adlandırılan (genelde image matrisden -kaynak resmimizin ifade edildiği matris- daha küçük bir boyutta alınan) farklı bir matris ile oluyor.

Bu işlem şu şekilde yapılır.

Kernel matrisin ilk elemanı, image matrisin ilk elemanına gelecek şekilde yerleştirilir. Yani kernel matrisin her elemanı, image matris üzerinde bir elemanın üzerinde durur.

Sonra, kernel matrisin her elemanını, image matrisde karşılığı olan (yani üst üste binen) elemanla çarpılır.

Çarpmalar sonucunda çıkan değerler toplanıp, output matrisde image matrisinde kernelin merkezi olan aynı konuma yerleştirilir.

Yukarıdaki resimde 105*0 + 102*(-1) + 100 * 0 + 103 *(-1) + 99 * 5 + 103 * (-1) + 101 * 0 + 98*(-1) + 104*0 = 89 olarak değer bulunur ve merkeze yerleştirilir.

Yapılan işlem karışık gibi görünsede, özünde vektörlerde yapılan nokta çarpımıdır. Yani,

Doğrudan karşılık gelen elemanları çarp, birbiri ile topla, merkezi konuma o değeri ata diyoruz. Bu işlem bittikten sonra kernel matris, image matris üzerinde kaydırılarak aynı işlem tekrar ediliyor ve output matris dolduruluyor.

Dikkat edildiğinde bu yöntemle output matrisin kenarları için herhangi bir hesaplama yapılamıyor. Bu duruma önerilen birkaç çözüm var.

Kenarları iptal edip, output matrisi küçültebiliyoruz.

Kullandığımız kernel size’ına bağlı olarak input matrisimize padding ekliyebiliyoruz ki yukarıdaki örnekte 1 pixellik padding(3x3 kernel size için) uygulayabiliriz.

Örnekle görelim.

Aynı işlemleri tekrarlıyoruz fakat burda bir problemimiz var. Output matrisde 0 ile 255 arasında alınması gereken pixel değeri maximum değerimi aşıyor, 320. Bunu çözmek içinde farklı yöntemler uygulanıyor. Mesela Histogram Equalization bunlardan biri. Daha sonra bu tekniğe değineceğiz.

Kavramsal olarak bu işlemlere bakıldığı zaman, kernel’e image filter ve kernel’in verilen image’e uygulanmasına image filtering deniliyor. Output olarak çıkan image’e de dolayısıyla filtered image adı veriliyor.

Bu işlemin image filtering ile ne alakası var ki şimdi çarpıp, topluyoruz, güncelliyoruz diyebilirsiniz. Fakat kernel matrisinde alınacak değerlere göre, resimler üzerinde blurring (bulanıklaştırma), detecting edges(kenarları belirleme) gibi birçok işlemi yapabiliyoruz. Sonraki yazımızda image filter olayını detaylı olarak pythonda ele alacağız. Değişen kernel değerlerine göre, yapılan işlemleri şu şekilde gösterebiliriz.

Kernele göre, yukarıda anlatılan işlemler uygulandığında output resimdeki çıktıları inceliyebilirsiniz.

Peki neden merkezi nokta alınıyor tarzında bir soru aklınıza gelebilir. Bunun sebebi signal sistemlerde çokca adını duyduğumuz delta(impulse) fonksiyonudur. Signal sistemlerinde, sisteme input olarak ne verilirse verilsin eğer o sistemin delta fonksiyonu biliniyorsa, sistemin outputu convolution ile rahatlıkla bulanabilir.

bu fonksiyon m ile n sıfır alındığında 1 çıktısı verip, diğer bütün noktalarda sıfır çıktısını veririr. Bu çıktı ise de görüntü işleme alanında kernel ya da filtre deniliyor. Bu konu ile alakalı detaylı bilgiyi bu linkten alabilirsiniz.

Kaynaklar:

https://wikipedia.org/p.php?https://en.wikipedia.org/wiki/Kernel_(image_processing)

http://machinelearninguru.com/computer_vision/basics/convolution/image_convolution_1.html

--

--