E-bergi'mizi yaz kış demeden takip etmeye devam eden tüm okuyucularımızla uzun bir aradan sonra yine computer vision (bilgisayarlı görme) konulu bir yazıda buluşmak ne kadar güzel. Malum mezun oldum; yeni düzen derken, sakın dergiyi ihmal ettim sanmayın. Yazı yazamasam da yayın ve yapım aşamasında hala sizlerleyim. :) Fazla da duygusallaşmadan yazımıza başlarsak, bu ay sizlere bir görüntünün bozulmalarını nasıl giderebileceğimizi anlatacağım. Yanlış anlaşılmasın, photoshop ile resim düzenlemekten bahsetmiyorum, bir görüntünün asıl düzlemine (veya istediğimiz şekle) dönmesi için dönüşüm matrisini bulmaktan ve bu matristen yararlanarak görüntüyü istenen hale getirecek bir süreçten bahsedeceğim.
Görüntü Dönüşümü Nedir?
En basit ve anlaşılır örnekle başlamak gerekirse, kendimize neredeyse iki boyutlu bir denek alanı seçelim. Diyelim bir sanat galerisinde fotoğraf çekmek istiyorsunuz. Duvardaki resmi tam karşıdan çekmek amacınız, ancak içerisi o kadar kalabalık ki duvarı karşıdan ve tam hizasından görmeniz mümkün değil. Fotoğrafı çok saçma bir açıdan çekseniz bile tam karşıdan çekmiş hale getirebileceğinizi söylesem inanır mısınız? Evet bu mümkün. Resimlerde birbiri ile eşleşen noktalar bulduğunuz sürece, resmin yansıtıldığı yüzeyi değiştirebilir ve görüntü ile oynayabilirsiniz. Bunun için aşağıdaki formülde kullanılan dönüşüm matrisini bulmanız yeterli.
x' = H x
Burada x' noktası, gerçek hayatta x noktasına karşılık gelen noktanın görüntü üzerindeki koordinatları. H ise dönüşüm matrisimiz, yani bütün sihir sadece bu matriste. Yalnız önemli bir noktaya deginmekte fayda var, nokta koordinatlarıyla yaptığımız işlemlerde homojen gösterimden yararlanıyoruz. Yani n boyutlu bir uzaydaki noktamızı göstermek için n değil, n+1 sayıya ihtiyacımız var. Dolayısıyla, henüz iki boyutta örneklendirdiğimiz için, x' ve x noktalarımızı 3 elemanlı vektörler ve H dönüşümü de 9 elemanlı bir matris. Ayrıntılara girmeden, homojen koordinatlar ile ilgili son bir detay da, bir eksik boyutu temsil ettikleri için birebir sayılar yerine bu sayıların önemli olması. Yani 3x3lük H matrisimizin serbestlik derecesi 9 değil, 8.
Detaylandırmak gerekirse, resimlerdeki bozulmalara göre bu dönüşümleri ve nasıl düzeltildiklerini inceleyeceğiz.
İzdüşümsel Dönüşüm (Projective Transformation)
Gerçekçi en genel dönüşüm olarak düşünebiliriz, çünkü bundan daha kapsamlı dönüşümler görüntüleri manipüle etmeye yöneliktir ve şu andaki amacımızla (düzeltme, bozma değil :) ) pek de ilgili değildir. Şekilde gördüğümüz gibi izdüşümsel dönüşüm, kameramızdan arka taraftaki düzlemimize ulaşan ışınların ön taraftaki bağımsız farklı bir düzlemle kesildiğinde elde ettiğimiz görüntüdür. Peki gerçekçilikten kastımız ne? Herhangi bir fotoğraf makinesi ile (lensiyle oynanmamış ve özel efektlerinden bağımsız olarak) bir düzlemin fotoğrafını çektiğinizde, gerçekteki düz çizgilerin düz kalmasını beklersiniz değil mi? İşte izdüşümsel bozulmada da esas olan düz çizgilerin görüntüde de düz çizgilerle eşleştirilmiş olmasıdır. Yani gerçek dünyada bir düzlem üzerindeki karenin görüntümüzde bir dörtgen olarak görünmesi o dönüşümün izdüşümsel olduğunu anlamamız için yeterli. Kısaca ilk baştaki genel dönüşüm denklemimize, homojen gösterimdeki doğru denklemini birleştirdiğimizde,
l<sup>T</sup> x = 0 => l'= H<sup>-T</sup>l
denklemini de yazabiliriz. Burada l gerçek çizgimizken, l' de onun görüntüsüdür. 2 boyutlu homojen gösterimde noktalar ve çizgiler birbirlerinin çifti (dual) oldukları için çizgileri de 3 elemanlı vektörler ile ifade ettiğimizde denklemimiz anlam kazanacaktır. Ayrıca yukarıdaki denklemin tutarlı olması için tabi ki H matrisimizin nonsingular olduğunu varsayıyoruz ve 8 serbestlik derecesine sahip bu dönüşüm için en genel halini şu şekilde gösteriyoruz:
H = | A t |
| v<sup>T</sup> 1 |
Burada A bozulmalara ve dönmelere karşılık gelen 2x2lik matrisi, t ilerlemelere karşılık gelen 2x1lik vektörü ve v de yine bozulmaya neden olan izdüşümsel vektörü temsil etmektedir. İzdüşümsel dönüşümün kapsadığı her türlü dönüşümde kullanılan dönüşüm matrisinin adı homografi (homography) olduğu için bundan sonra H matrisine homografi olarak değineceğim. Buraya kadar öğrendiklerimize göre, bir resmin izdüşümsel bozulmasını giderebilmek için dönüşümün tersini uygulamak, yani homografisini bulmak yeterli görünüyor değil mi? Homografileri bulmak farklı yollar izleyeceğiz, ancak önce dönüşüm çeşitlerini tanımaya devam edelim.
İlgin Dönüşüm (Affine Transformation)
İzdüşümsel dönüşümün bir alt kümesi olan ilgin görüntü dönüşümünde homografimizi biraz daha sınırlıyoruz. Deminki düzlemsel karemizi düşünürsek, izdüşümsel dönüşümde dörtgen ile sınırladığımız şeklimiz ilgin dönüşümde ise paralelogram ile sınırlanıyor. Yani ilgin dönüşüme uğrayan manzaralardaki paralel çizgiler, görüntülerinde de paralel kalıyorlar. Bununla birlikte ortaya çıkan diğer özellik ise, fotoğrafı çekilen iki çizginin veya iki alanın oranlarının, görüntüdeki oranlarına eşit kalması. İlgin dönüşümün homografisini ise şu şekilde gösteriyoruz:
H = | A t |
| 0<sup>T</sup> 1 |
Dikkat ederseniz bir önceki dönüşümdeki bozulmaya neden olan v vektörü burada sıfırlandığı için nispeten daha az bozulmamız mevcut. Ayrıca ilgin dönüşüm homografimizin serbestlik derecesinin 8den 6ya inmesinden bozulmanın daha az parametrede belirdiğini görebilirsiniz.
Benzeşim Dönüşümü (Similarity Transformation)
Benzeşim dönüşümü de ilgin dönüşümün bir alt kümesidir. Tahmin edebileceğiniz gibi bu sefer karemiz görüntüsünde yine kare olarak kalıyor, ancak şekil koruyucu (shape preservıng) olan bu dönüşümde birebir aynı görüntüyü tabi ki elde etmiyoruz. Karemiz dönmüş ve ölçeklenmiş başka bir kare olarak karşımıza çıkyor, yani benzeşim dönüşümünde önceki sınırlamalarımıza bir de görüntüde açıların aynı kalmasını ekliyoruz. Benzeşim dönüşümünün homografisinde ise gösterim olarak ilgin dönüşümden bir fark yok, ancak bozulmaları ve dönmeleri temsil eden A matrisimize 'bozulma olmasın, sadece dönme olsun' kısıtlamasını koymamız gerekiyor. Bunun için A'nın orthonormal olması gerekmektedir, bunu da şu şekilde ifade ediyoruz:
A<sup>T</sup>A = e<sup>2</sup> I
Yani homografimizi yapılandıran A matrisimizin devriği ile çarpılmasından elde ettiğimiz sonuç birim matrisin herhangi bir pozitif katıysa o dönüşüme benzeşim dönüşümü diyebiliriz. Diyelim ki şeklimizi a derece döndürdük. Buna göre homografimizi açarsak,
H= | s cos(a) s sin(a) t<sub>x</sub> |
| -s sin(a) s cos(a) t<sub>y</sub> |
| 0 0 1 |
şeklinde olduğunu görebiliriz, yani ilgin dönüşüm 6 serbestlik derecesine sahipken, benzeşim dönüşümümüz 4 serbestlik derecesine sahiptir, sadece ölçeklenebilir (s), döndürülebilir (a) ve ilerletilebilir (t<sub>x</sub>, t<sub>y</sub>).
Öklit Dönüşümü (Euclidian Transformation)
En küçük alt küme olan bu dönüşümün benzeşim dönüşümünden farkı, ölçeklenmenin giderilmiş olmasıdır. Yani yukarıdaki homografide s=0 aldığımızda öklit dönüşümü için gereken homografiyi elde ederiz. Diger bir değişle A matrisine koyduğumuz kısıtlama daha da sertleşir ve
A<sup>T</sup>A = I
halini alır. Bu homografinin serbestlik derecesi de tahmin edebileceğiniz gibi 3'tür. Karemizin sadece öklit dönüşümlü hali de yukarıdaki gibi görünecektir çünkü esas boyutunda koyamıyoruz :)
Homografi Bulmaca
Homografi elemanlarımızı hesaplamak için birkaç yol göstereceğim ve hepsi de görüntü ile gerçek dünya arasında bildiğimiz eşleşmeler olduğunu varsaymaktadır. Bunların dışında daha gelişmiş yöntemleri gelecek sayılarımızda anlatabiliriz, ancak bu yazının başlangıç seviyesini gözeterek diğer yöntemlere yer vermeyeceğiz.
Nokta Eşleştirmeleri
Genel homografi denklemimizi düşündüğümüzde, en basit homografi bulma yöntemi olarak hepimizin aklına gelecek yöntemdir. Denklemi lineer sistem olarak düşündüğümüzde
| x<sub>1</sub>' | | x<sub>1</sub> |
| x<sub>2</sub>' | = H | x<sub>2</sub> |
| x<sub>3</sub>' | | x<sub>3</sub> |
şeklinde 3 denklemimiz olacaktır. Ancak homojen gösterimden yararlandığımız için fiziksel koordinatlara geçtiğimizde her nokta için aynı homografi ile eşleştirme yaptığımız 2 denklemimiz var. Homografimizde ise 8 bilinmeyen olduğunu biliyoruz, demek ki gerçek dünya ve görüntü ile eşleşmiş en az 4 nokta çifti bilmemiz homografiyi çözmemizde yeterli.
Ayrıca çok daha fazla eşleştirme kullanarak çok daha kaliteli bir homografi elde etmek de mümkün. Lineer veya nonlineer yaklaşma metodlarını kullanan bu çözüm başta bahsettiğim gelişmiş çözümler arasında. Bu çözüme örnek olarak soldaki eşleştirme noktaları kullanılarak elde edilmiş homografinin ikinci görüntüyü birinciye benzetme amaçlı kullanılışının sonucunu sagda görebilirsiniz. Son olarak, bu n noktanın doğrusal olmamasına dikkat etmemiz gerekiyor.
İzdüşümsel Bozulmayı Gideren Homografi
Bir diğer yaklaşım ise bozulmaları adım adım gidermektir. En geniş grup olan izdüşümsel dönüşümü ele aldığımızda, bunun ilgin dönüşümden farkını düşünelim. Birinde paralellik korunuyor diğerinde ise korunmuyor, demek ki gerçekte paralel çizgileri izdüşümsel görüntüde de paralel hale getirebilirsek sorunumuz çözülecek. Bunun için biraz hayali olan ama matematiksel anlamının hayran bıraktığı bir konseptten yararlanıyoruz: sonsuz çizgisi (vanishing line). Homojen koordinatlar kullanıldığında, paralel çizgilerin bir noktada kesiştiği varsayılır ve bu noktaların hepsinin bir çizgi oluşturduğu görülür, bu çizgiye sonsuz çizgisi diyeceğiz. Aynı konsepti 3 boyuta taşıdığımızda çok daha ilginç sonuçlarla, ve aslında hayaletlerle :) karşılaşıyoruz ancak bunu başka bir yazımıza saklayalım.
Sadece işlemlerden tanıdığımız sonsuz çizgisinin aslında fotoğrafını çekebildiğimizi söylesem cok da şaşırmazsınız umarım. İzdüşümsel bozulmaya uğramış bir görüntü düşünelim, yine aynı karemizi kullanalım. Karenin paralel kenarları artık paralel değil ve uzatırsak bir noktada kesişecekler, bu noktaya a diyelim. Diğer iki paralel kenarın kesiştiği noktaya da b diyelim. A ve b normalde sonsuzdaki noktalar olacağı için, bu iki noktadan geçen tek çizgi sonsuz çizgisidir ve böylece o soyut kavramı aslında sadece kurşun kalemimizin iki noktayı birleştiren izi olarak görebiliyoruz, ne kadar ilginç :) Bu çizgiyi tekrar sonsuz çizgisine gönderen homografiyi bulduğumuz anda da problemi çözeceğiz. Daha fazla uzatmadan, sonsuz çizgisinin görüntüsünü bulduktan sonra homografiyi kolayca elde edebilmeniz için aşağıdaki gibi matrisi yazmanız yeterli.
H = | 1 0 0 |
| 0 1 0 |
| l<sub>1</sub>' l<sub>2</sub>' l<sub>3</sub>' |
İlgin Bozulmayı Gideren Homografi
Bunun içinse sonsuz çizgisine benzer bir konsepti, dejenere konik kavramını kullanacağız. Temel kavramlardan biri olan dejenere koniğin ve onun çiftinin tanımına ve teorik anlamına girmeden, bizim için tek önemli özelliğini söylemek gerekirse, kullanacağımız konik herhangi bir dönüşümden etkilenmiyor.
Diyelim görüntümüzde iki çizgi var (l' ve m') ve bunlar normalde dik. Ayrıca bunları daha önce anlattığımız ilgin dönüşüm bölümündeki denklem ile yazabiliyoruz. Aralarındaki açının kosinüsünü yazdığımızda, 0a eşit olacağı için sadece payı alarak bunu bir dejenere konik çiftiymis gibi yazabiliriz. Bu paya koniklerin dönüşüm formülünü uyguladığımızda, elde edeceğimiz sonuç sagdaki gibi olacaktır, ve daha da sadeleştirdiğimizde ortadaki çarpım matrisleri yerine sadece 2x2lik bir ölçekleme matrisi (S) yazabiliriz. Bu matris simetrik olacağından, daha da sadeleştirerek A matrisini soldaki denklem sisteminden elde edebiliriz ve böylece bu matrisi yerine koyarak homografimizi bulabiliriz. Tabi bunun için yine birden çok aralarında 90 derece açı olan çizgi çiftlerine ihtiyacımız olacak. Bu kısım biraz özet oldu ancak ancak her bilgisayarlı görme kaynağından bu konseptler hakkında daha fazla bilgi alabilirsiniz.
Bilgisayarlı görmenin en temel uğraşlarından birini özetlemeye çalıştım. Daha birçok algoritmaya konu olmuş ve hala araştırmaya açık bu alana olan ilginizi biraz besleyebildiysem ne mutlu bana. Bir yazımın daha sonuna gelmişken, bu ve benzeri konularda daha nice yazılarda buluşmak üzere e-bergi-severler... :)