Sıfırdan Bilgisayarlı Görü ve Görüntü İşleme: Giriş

Öncelikle uzun zamandır bir metin yazmadığımı takip edenleriniz fark etmiştir. Yaklaşık dört aydır başka bir ülkede değişim öğrencisi olarak bulunuyorum, Avrupa'yı ve hayatı keşfedişimdeki heycanımdan dolayı pek fazla yazmaya fırsat bulamadım.

Bu akşam bir şeyler karalamak istedim ve bu konunun kesinlikle Bilgisayarlı Görü ve Görüntü İşleme üzerine olacağına emindim. Birçok blog yazarı veya eğitmen bu konuya kütüphaneler (örneğin OpenCV) aracılığı ile değiniyor olsa da, ben tamamen farklı bir metot izleyeceğim. Teorik kısımları Türkçe bir şekilde yazı içinde gerek görsellerle gerek videolarla anlatacağım ve pratik örnekleri MATLAB, C++ ya da Python kullanarak sizlere vereceğim.

Umarım düşündüğüm kadar uzun soluklu, bir o kadar da eğitici bir içerik hazırlayabilirim. Şimdiden teşekkür ediyorum okuyucularıma.

Görüntü Tipleri

Beynimiz nasıl imgeleri hafızamızda saklıyor, bunun üzerine henüz yeterli bir bilgim yok ancak nasıl gördüğümüzü merak edenlere Evrim Ağacı'nın şu videosunu tavsiye edebilirim. Bir diğer taraftan, bilgisayarlar görüntüleri iki farklı yolla saklarlar. Bunlardan biri nitelikleri açıklanmış vaziyette olan vektörel saklama, diğeri ise renkleri tek tek verilmiş vaziyette olan raster saklamadır. Rasterizasyon, bir mekansal verinin hücresel biçimde açıklanma olayına verilen addır, sürecin kendisini biraz ileride daha rahat anlayacaksınız.

Vektörel İmgeler

Vektörel saklama ile bir masa görüntüsü, belirli başlangıç ve bitiş noktalarına sahip birçok doğrunun birleşimi ve bu birleşimlerden doğan çokgenlerin renklendirilmesi ile belirtilebilir. Burada saklanacak veri yalnızca başlangıç ve bitiş koordinatları ile bölgesel renk değerleridir. Aslında SVG dosya tipi ile sakladığımız görseller bu formattadır. Bu saklama biçiminin bir diğer avantajı, görselin boyutunun rahatça -biraz matematik ile- değiştirilebilmesidir. Ne de olsa değiştirilecek şey bir vektördür (yönlü doğru) ve vektör analizi dersi bize bunu çoktan öğretmiştir!

Her şeyde olduğu gibi vektörel saklamanın da dezevantajı vardır. Bu dezavantaj ise görselin ekranlar tarafından görüntülenebilmesi için rasterizasyon sürecinden geçmesidir. Bildiğiniz gibi bir ekran birçok küçük renkli ışığa (hücreler) sahip bir düzlemdir. Bahsettiğimiz masa görüntüsünün ekranda oluşabilmesi için her bir hücrenin hangi renk alacağı ekranın işlemcisine söylenmelidir.

Her görüntü vektörel olarak ifade edilemeyebilir!

Raster İmgeler

Rasterizasyon işlemini kafanızda hayal etmenizi istiyorum. Bu makaleyi okuduğunuz bilgisayarınızdan veya telefonunuzdan yalnızca iki saniye gözlerinizi ayırarak karşınızdaki görüntüye bakınız. Bu görüntüyü bir tablo gibi (sayılar önemsiz ama) 100 sutün ve 100 satıra böldüğünüzü düşünün. Gördüğünüz tabloyu bir kağıda aktardığınızda her bir hücrenin rengini not aldığınızı varsayın. Elinizdeki kağıttaki bilgi, aslında bir bilgisayarın görüntüyü saklama biçimi ile aynıdır. Sevdiğiniz bir manzara veya bir ay önce fotoğrafını çektiğiniz köpeğinizin imgesi, bilgisayarınızın kalıcı belleğinde milyarlarca hücre ve bu hücrelerin renkleri olarak tutuluyor. Bizler, bilgisayar bilimleri camiasındakiler olarak, görsel imgedeki her bir hücreye piksel adını veriyoruz. Küçük bir not olarak düşelim, vektörel imgelerde pikseller bulunmaz.

Bir raster imge (veya görüntü) olabildiğince yüksek alan kaplar, vektörellere göre bu bir dezavantajdır. Bu yüksek alan gereksiniminden dolayı, internet sunucuları veya düşük hafızalı cihazlarda saklanması için sıkıştırılması gereklidir. Şu an kullanımda olan birçok sıkıştırma algoritması vardır ve bazı algoritmalar bilgi kaybına da yol açarlar. Bir başka dezevantaj olarak görüntü büyütme işlemi de kalite kaybına yol açar.

Pek tabi ki en popüler saklama metodu olan raster imgelerin avantajları da yok değildir. En önemli özelliği kolay bir şekilde işlenebilmesidir. Ki bu özellik, bu yazı dizimiz boyunca neden raster imgelerle çalışacağımızın da nedenidir. Raster imgeler, ek bir işleme ihtiyaç duymadan, ekranlarda görüntülenebilir haldedir.

Raster imgelerdeki bir dezevantaj: Aliasing. Görsel kaynağı: StackOverflow.
Raster İmge Sıkıştırması ile Alaklı Küçük Detaylar
  • Görüntü sıkıştırma metotları iki kategoriye ayrılır: kayıplı (en. lossy) ve kayıpsız (en. loseless) sıkıştırma. Kayıplı sıkıştırma kendi içinde dört üç kategoriye dağılır, bu kategoriler içlerindeki algoritmaların "neyden kayıp verdikleri" üzerine ayrılmıştır. Bunlar, transform kodlama, renk uzayını daraltma, renk yerine parlaklık kullanma.
  • Transform kodlama metodu, görseli birden çok hücreye parçalayıp (hücreler piksel seviyesinde değil, pikseller seviyesinde) bu hücrelerin transformunu alma ve elde edilmiş sayısal verinin tamsayıya yuvarlanması işlemidir. Fotoğraflarda kullanılan JPEG ve HEIC, videolarda kullanılan MPEG ve H.26x, seslerde kullanılan MPEG, MP3 ve AAC sıkıştırma metotları bu tipe örneklerdir.
  • Renk uzayını daraltma metodu, seçilmiş bir renk paletine göre görseldeki renkleri değiştirmek ile sıkıştırmayı sağlar.
  • Renk yerine parlaklık kullanma metodu ise insanların parlaklık değişikliklerine olan hassasiyetinin renk değişikliklerine göre daha fazla olduğu prensibine dayanır. Bu metot çoğunlukla video işlemede kullanılır.
  • Kayıpsız görüntü sıkıştırma metotlarından en çok aşina olduklarımız BMP, TGA ve TIFF'de kullanılan run-length encoding, GIF ve TIFF'de kullanılan Lempel–Ziv–Welch algoritması, PNG ve TIFF'de kullanılan DEFLATE. Bunların detaylarını ise ilgililenenlere araştırmaya bırakıyorum. Gelecek yazılarda bu metotlarla direk ilgilenmemiz gereken bir durum yaratmayacağız.
Creator: Yug, modifications by Cfaerber et al. from Wikimedia Commons.

Renk Paletleri

Renk paleti, ilgili görselde bulunan tüm renklerin kümesine verilen addır. İnsan gözü 10 milyon rengi ayırt edebilir şekilde evrilmiştir. Teknolojinin dili olan ikili sistemde (en. binary) 10 milyon sayısını kapsayan en düşük değer 16.7 milyon sayısına karşılık gelir ve 24 karakterden oluşur. Biraz karşık olsa da anlatmak istediğim şudur: 10 milyon tane farklı şeyi ifade edebilmek için 24 tane 0 veya 1'den oluşan karakter kullanmalıyız. Durum renkler için böyle olsa da, gri tonajında ise çok daha az seçiciyiz. Çünkü insan gözü yalnızca 128 farklı gri tonunu ayırt edilebilir şekilde evrilmiştir!

Dithering, belirli bir renk paletini kullanarak ara renkleri insan gözüne göstermeye yarayan metottur. Siyah ve beyazdan oluşan bir palet düşünelim. Yaratmak istediğimiz renk ise tam ara tondaki gri olsun. Eğer ki biz bu siyah rengi noktalar halinde beyazların içine tamamen %50 oranında karıştırırsak insan gözü yeterli uzaklıkta bu kümeyi gri olarak algılayacaktır. Aşağıdaki görselde de bu metotun ne kadar efektif olduğunu görebilirsiniz.

David by Michelangelo; dithered by User:Gerbrant using own software, Public domain, via Wikimedia Commons

Gazete kağıtlarının köşelerinde bulunan camgöbeği, magenta, sarı ve siyah renkleri de bu amaçla bulunmaktadır. Gazetedeki görseller veya renkler bu dört ana renk kullanılarak -çok küçük noktalara sahip- dithering ile yaratılabilmiştir.

Tim Brookes

Koordinat Sistemleri

Bilgisayarlı grafik sistemlerinde iki tip koordinat sistemi kullanılır. Bunlardan biri, lisede aktif olarak kullandığımız kartezyen koordinat sistemidir. Bu sistem bir tablo olarak düşünülebilir ve buna göre her piksel bir hücre ile temsil ediliyor olur. Herhangi bir pikseli belirtebilmek için artık yalnızca onun konumunun sütun ve satır değerini vermemiz yetecektir. Aşağıdaki tabloyu aklınızda yer etmesi adına hazırladım. Numaralandırmayı sol üst köşeden yapmış olmama dikkat çekmek istiyorum. Bu tip sol üst köşedeki pikseli orjin kabul eden kartezyen koordinat sistemlerine solak (en. left-handed) denir. Tabloda gördüğünüz (1, 6) koordinatındaki pikselden başlayan sistemlere ise sağlak (en. right-handed) denir.

(1,1)(2, 1)(3, 1)(4, 1)(5, 1)(6, 1)
(1, 2)(2, 2)(3, 2)(4, 2)(5, 2)(6, 2)
(1, 3)(2, 3)X(4, 3)(5, 3)(6, 3)
(1, 4)(2, 4)............
(1, 5)...............
(1, 6)...............

Gördüğünüz X pikseli, solak tipteki sistem düşünüldüğünde (3, 3) koordinatında yer alırken sağlak tipteki sistem düşünüldüğünde (3, 4) koordinatında yer alır.

Bir diğer çok kullanılan sistem ise kutupsal koordinat sistemidir. Bu sistemde herhangi bir nokta, yatay doğrudan başlayıp dikey doğruya doğru yönelen bir açı ve çizgi boyutu olarak ifade edilir. Eğer ki vektörler ne demek biliyorsanız, ki ileride çok kullanmamız gerekecek, bir noktayı bir vektör ile ifade ettiğimizi düşünebilirsiniz.

Görsel kaynağı için Khan Academy

Görselde $r$ ile işaretlenmiş olan uzunluk, noktamızın orjine olan uzaklığını temsil etmektedir. $\Theta$ ise x-ekseninden başlayarak y-ekseninize uzanan açımızın değeridir. Kartezyen koordinat sisteminde (x, y) olarak gösterdiğimiz herhangi bir noktayı kutupsal koordinat sisteminde (r, $\Theta$) olarak gösteririz ve $r$ ile $\Theta$ şöyle bulunur:

$$
r = \sqrt{x^2 + y^2}
$$
$$
\Theta = tan^{-1}\left(\frac{y}{x}\right)
$$

Ya da tersten gidecek olursak x ile y şöyle bulunur:

$$
x = r \cdot cos(\Theta)
$$
$$
y = r \cdot cos(\Theta)
$$

Koordinatları İfade Etme Tipleri

Koordinat sistemlerinde belirli bir noktayı nasıl ifade edeceğimizi öğrendik. Peki ya, bir imgeye nasıl koordinat sistemi ataması yapacağız? Örneğin, bir fotoğraftaki herhangi bir pikseli seçmek istiyoruz; ekrandaki piksel sayısına göre mi tablo olarak düşüneceğiz, yoksa gerçek hayatta kullandığımız koordinatlara göre mi düşünmeliyiz?

Bu problem aslında çok gereksiz gibi gözükse de, ki hepinizin "Tabi ki ekrandaki piksel sayısına göre!" dediğinizi duyar gibiyim, aslında bakılırsa düşünülmesi elzem konulardan geliyor.

Her ekrandaki piksel sayısı birbirinin aynısı olmak zorunda değil. Kimimizin ekranı 1920x1080 iken kimimizin ekranı 4096×3112. Aynı fotoğrafı iki farklı ekran tipinde açtıktan sonra ikisinin de sağ üst köşedeki pikselini nasıl isteyeceğiz? 1920x1'inci piksel dersek bu 4K ekranımızda tam köşeye denk gelmeyecektir sizin de tahmin edeceğiniz gibi.

  • Ekranın gerçek pikselleri ile belirtme: Farklı ekranlarda farklı koordinat ortaya çıkacaktır. Örneğin 1920x1'inci piksel.
  • Ekranın normalize edilmiş boyutu ile belirtme: Her ekranın son pikselinin 1x1 olduğunu düşünülür ve istenilen piksel ondalık değerlerler belirtilir. Örneğin 1x0'ıncı piksel ya da 0.4479x0.3907 pikseli (1920x1080'lik ekranda 860x422'inci piksele eşdeğerdir.)
  • Dünya koordinatları ile belirtme: Genellikle 3D modellerde kullanılan bu ifade şekli, günümüzdeki VR/AR akımı neticesinde daha popüler olmaktadır. Görselin bulunduğu dünyaya bir koordinat düzlemi atanır ve her cisim dünyadaki belirlenmiş orjine göre ifade edilir. Bu tipe örnek olarak VRML ve X3D dilleri verilebilir.

Bilgisayarda Görüntüleme Süreci

Aşağıdaki vektörel imge aracılığı ile bilgisayarlardaki görüntüleme sürecini anlayabilirsiniz.


Henüz yeni başladığımız bu yazı serisi serüvenimize aşağıdaki konular ile devam edeceğiz, eğer ki ilginizi çeken veya yanlış olduğunu düşündüğünüz bir durumla karşılaşırsanız bana e-posta adresimden ve LinkedIn'imden ulaşmaktan çekinmeyin. Okuduğunuz için teşekkür ederim.

  1. Giriş
  2. Dijital İmgelerde İşlemler
  3. İmgelerde Filtrasyon
  4. Renk Dönüşümleri ve İkilileştirme (Siyah-beyazlaştırma)
  5. Morfolojik İşlemler
  6. İkili İmgelerde Analiz
  7. İmge Değerlendirme Metotları
  8. ...

İleri Okuma

  1. Image Compression https://en.wikipedia.org/wiki/Image_compression
  2. Transform Coding https://en.wikipedia.org/wiki/Transform_coding
  3. What is dithering in Computer Graphics? https://www.howtogeek.com/745906/what-is-dithering-in-computer-graphics/