5.16. Özel evrişim çekirdekleri¶
Buraya kadar ele alınan komşuluk filtrelerinin her biri, filtrenin her konumdaki pencereye uyguladığı yerleşik bir istatistiğe sahipti: ortalama, Gauss ağırlıklı ortalama, medyan. morph(), uygulamanın istatistiğin kendisini bir çekirdek biçiminde sağlamasına olanak tanıyan tek filtredir: çekirdek, filtrenin komşuluk piksellerini tek bir çıktı değerinde nasıl birleştirmesi gerektiğini açıklayan küçük bir ağırlık matrisidir.
Mekanizma, klasik evrişim işlemidir. Her çıktı konumunda, her komşuluk pikseli çekirdekteki eşleşen ağırlıkla çarpılır, çarpımlar toplanır, sonuç isteğe bağlı olarak ölçeklenip kaydırılır ve değer çıktı pikseline yazılır. Farklı çekirdekler aynı girdiden farklı sonuçlar üretir. Tüm ağırlıkları eşit ve pozitif olan bir çekirdek mean() filtresini yeniden üretir; çan şeklinde olan biri ise gaussian() filtresini yeniden üretir. Bunların ötesindeki desenler kenar yanıtları, kabartmalar, gradyanlar, keskinleştirme, hareket bulanıklığı ve klasik görüntü işlemenin tek bir doğrusal geçişle yapmak istediği daha pek çok başka etki üretir.
5.16.1. morph metodu¶
İmza, fazladan tek bir argümanla diğer komşuluk filtrelerine benzer:
img.morph(size, kernel, mul=1.0, add=0.0)
size, her yerdeki gibi yarıçaptır; dolayısıyla çekirdek tam olarak (2 * size + 1) satır ve (2 * size + 1) sütun olmalıdır. Çekirdeğin kendisi, bu kadar sayının satır öncelikli sırayla yer aldığı düz bir Python listesidir; ilk (2 * size + 1) girdi en üst satırdır, sonraki (2 * size + 1) girdi ikinci satırdır ve en alt satıra kadar bu şekilde devam eder. mul, çarpımlar toplamını çıktı pikseline yazılmadan önce ölçeklendirir ve add bir sabit ekler. Varsayılan mul=1.0 ve add=0.0 değerleri, evrişim çıktısını değiştirmeden bırakır.
Açıkça belirtmeye değer bir ayrıntı: metot, çıktıyı yazmadan önce çarpımlar toplamını otomatik olarak çekirdek girdilerinin toplamına böler. Bu otomatik bölme sayesinde, girdileri dokuza toplanan bir ortalama alma çekirdeği (örneğin 3’e 3’lük bir kutu bulanıklığı) hiçbir ek çaba olmadan dokuzda bir ölçekte çıkar; girdileri on altıya toplanan bir Gauss yaklaşımı çekirdeği ise on altıda bir ölçekte çıkar; her ikisinde de uygulamanın bölmeyi kendisi hesaplaması gerekmez. Uygulama mul değerini yalnızca otomatik normalleştirmenin üzerine ek bir ölçek istediğinde ayarlar; ya da daha yaygın olarak, çekirdek sıfıra toplandığında (bir kenar yanıtı çekirdeği) ve otomatik bölme hiçbir şeye bölme olacağında ayarlar. Çerçeve bu durumda toplamı bir olarak ele alır ve mul, ölçeklenmemiş çarpımlar toplamını aralık içinde tutmanın tek ayarı haline gelir.
Uyarlamalı eşikleme bölümündeki threshold=True / offset=N çifti morph() üzerinde de çalışır; böylece aynı özel çekirdek çerçevesi, kesme noktası özel bir istatistik tarafından hesaplanan bir ikili eşik üretebilir.
5.16.2. Çekirdek düzeni¶
3’e 3’lük bir çekirdek (size=1), soldan sağa, yukarıdan aşağıya dizilmiş dokuz sayıdan oluşan düz bir listedir. Liste üç Python satırına bölünürse bu kural doğal biçimde okunur:
sobel_x = [-1, 0, 1,
-2, 0, 2,
-1, 0, 1]
Bu, Sobel-x gradyan operatörüdür; herhangi bir uygulamanın isteyeceği ilk standart çekirdek ve baştan sona incelemek için faydalı olanıdır. Desen basittir: sol sütunda negatif ağırlıklar, sağ sütunda pozitif ağırlıklar, orta sütunda ise sıfır vardır. Satır ağırlıkları -1, -2, -1 (veya sağda 1, 2, 1) ortada köşelere göre daha yüksektir; bu da orta satıra sonuç üzerinde köşe satırlarından daha fazla etki kazandırır.
Çekirdek dikey bir kenar boyunca tarandığında (solda karanlık, sağda parlak olan bir piksel sütunu), negatif ağırlıklar karanlık tarafı, pozitif ağırlıklar parlak tarafı yakalar. Çarpımlar toplamı büyük pozitif bir sayıdır ve filtre bunu parlak bir çıktı pikseli olarak yazar. Düzgün parlaklığa sahip yatay bir alan sıfır üretir; çünkü her pozitif ağırlık, aynı değere sahip bir piksel üzerinde aynı büyüklükte bir negatif ağırlıkla eşleşir.
Çekirdeği çalıştırma:
img.morph(1, sobel_x, mul=0.25)
Sobel çekirdeği sıfıra toplanır (sol taraftaki her negatif ağırlık, sağda eşit bir pozitif ağırlıkla eşleşir); bu nedenle otomatik bölme hiçbir şeye bölmez ve mul, çarpımlar toplamı üzerindeki tek ölçektir. mul=0.25, yanıtı aralık içinde tutar: Sobel-x’in 3’e 3’lük bir alandan üretebileceği en büyük mutlak toplam yaklaşık 4 * 255 = 1020 (2 değerine kadar ağırlıklandırılmış sekiz parlak piksel) olup, bunu dörde bölmek uç durumları biçimin onları temiz biçimde kırptığı 255 değerine indirir.
Buna eşlik eden Sobel-y çekirdeği, aynı ağırlık desenini 90 derece döndürerek yatay kenarları tespit eder:
sobel_y = [-1, -2, -1,
0, 0, 0,
1, 2, 1]
Yönü ne olursa olsun herhangi bir kenarı tespit etmek isteyen uygulamalar genellikle her iki Sobel’i de çalıştırıp yanıtları birleştirir.
5.16.3. Çıktıyı kaydırma¶
add, ölçekleme öyküsünün diğer yarısıdır. Sıfır toplamlı bir çekirdeğin yanıtı işaretlidir; bir kenarın bir tarafında pozitif, diğer tarafında negatiftir ve işaretsiz bir piksele yazıldığında negatif yarı sıfıra kırpılır. add=128, yanıtı orta-griyi merkez alacak şekilde kaydırır; böylece negatif yanıtlar 128 altındaki değerler olarak hayatta kalır ve pozitif olanlar üzerine düşer: bir kenar yanıtı veya bir kabartma, her bir yöndeki aralığın yarısı pahasına her iki yönde de görünür hale gelir.
Bir çekirdeğin hangi mul ve add kombinasyonunu beklediği, çekirdeğin tasarımının bir parçasıdır; standart çekirdek kataloğu her yaygın çekirdek için doğru ayarları listeler.
5.16.4. Daha büyük çekirdekler¶
Bu sayfadaki her şey 3’e 3’lük çekirdeklerle (size=1) anlatıldı; çünkü standart kataloğun kullandığı boyut budur ve satır öncelikli düzen bu boyutta elle yazmak için kolaydır. Yine de mekanizmadaki hiçbir şey çekirdeği 3’e 3 ile sınırlamaz. size=2, düz listede yirmi beş girdiyle 5’e 5’lik bir çekirdek çalıştırır; size=3, kırk dokuz girdiyle 7’ye 7’lik bir çekirdek çalıştırır; ve uygulamanın bedelini ödemeye razı olduğu yarıçapa kadar bu böyle devam eder. Çerçeve, herhangi bir tek boyutta hem düz liste hem de iç içe satır düzenlerini işler.
Daha büyük bir çekirdeğe başvurmanın nedeni, yerleşik filtrelerin herhangi birinde daha büyük bir komşuluğa başvurmanın nedeniyle aynıdır: daha fazla ortalama alma, daha geniş öznitelik tespiti, tek piksellik gürültüye daha az duyarlılık. Maliyet, yarıçapın karesiyle artar; 5’e 5, 3’e 3’ün piksel başına işinin kabaca 2,8 katını, 7’ye 7 ise yaklaşık 5,4 katını yapar ve bu çarpan doğrudan kare hızından düşer.
Pratik yaklaşım, standart katalog için size=1 boyutunda kalmak ve daha büyük boyutlara yalnızca algoritma daha büyük komşuluğa ihtiyaç duyduğunda başvurmaktır. Kenar tespit ediciler 3’e 3’ün ötesinde nadiren fayda sağlar; yumuşatma filtreleri bazen sağlar; doğru boyut, uygulamanın vurgulamaya veya bastırmaya çalıştığı özniteliklerin ölçeğine bağlıdır.
5.16.5. morph’a ne zaman başvurmalı¶
Günlük yumuşatma için mean(), gaussian() ve bilateral() daha hızlı ve daha temizdir. Kenar tespiti için laplacian() ve find_edges() özel amaçlı yapılmıştır. Doğrudan morph() filtresine başvurmanın gerekçesi, uygulamanın yerleşik filtrelerin sunmadığı belirli bir evrişime ihtiyaç duymasıdır; yönlü bir Sobel, özel bir kenar şablonu, hattın geri kalanının arayacağı belirli bir dokuya göre ayarlanmış bir çekirdek ya da klasik görüntü işlemenin onyıllar boyunca biriktirdiği faydalı çekirdeklerden oluşan standart kataloğun herhangi biri. Keyfi çekirdeklerin tam esnekliği kullanılabilir; bedeli ise, istediği sonucu üreten çekirdek değerlerini seçmenin uygulamanın sorumluluğunda olmasıdır.