FPGA Üzerinde Görüntü İşleme: ISP Zincirleri ve Gürültü Azaltma

/ Kaan Mansuroğlu / FPGA Tasarım Mühendisi
#FPGA#ISP#Görüntü İşleme#Gürültü Azaltma#AXI4Stream
FPGA Üzerinde Görüntü İşleme: ISP Zincirleri ve Gürültü Azaltma

Bir kamera sisteminde sensörün gördüğü ile ekranda görünen aynı şey değildir. Sensörden çıkan veri ham, düz, renksiz ve gürültülüdür. Aradaki farkı kapatan yapıya ISP, yani görüntü işleme zinciri diyoruz.

Masaüstü ve mobil tarafta bu zincir çoğunlukla hazır bir blok olarak gelir; siz yalnızca parametrelerini ayarlarsınız. Gömülü görüntüleme sistemlerinde ise zincirin kendisini siz kurarsınız. Hangi blokların olacağına, hangi sırayla duracaklarına ve her birinin kaç saat çevriminde bitmesi gerektiğine siz karar verirsiniz.

Bu yazıda FPGA-SoC platformları üzerinde kurduğumuz görüntü zincirlerinden yola çıkarak üç şeyi anlatıyoruz: zincir hangi bloklardan oluşur, blokların sırası sonucu neden bu kadar değiştirir ve gürültü azaltma gerçek zamanlı çalışacak şekilde nasıl kurgulanır.

ISP zinciri neyi düzeltir?

Ham sensör verisi doğrudan görüntülenebilir bir şey değildir. Piksellerin bir kısmı ölüdür, siyah seviyesi sıfırda değildir, her piksel tek bir renk kanalı taşır, beyaz beyaz görünmez ve gürültü her yerdedir. ISP zinciri bu eksiklerin her birini ayrı bir blokla kapatır.

ISP zinciri: sensörden ekrana ISP zinciri: sensörden ekrana

Zincirin ilk yarısı sensör alanında çalışır ve ham veriyi düzeltir: kusurlu piksel onarımı, siyah seviye çıkarma, demosaic, beyaz dengesi ve gama. İkinci yarısı görüntü alanında çalışır ve algılanan kaliteyi belirler: gürültü azaltma, kontrast, keskinleştirme ve kodlayıcının beklediği renk formatına dönüşüm.

BlokGöreviNeden programlanabilir mantıkta?
Kusurlu piksel, siyah seviyeSensöre özgü sabit hataları temizlerHer piksel için, sabit gecikmeyle çalışması gerekir
DemosaicBayer örüntüsünü tam renkli görüntüye çevirirKomşuluk penceresi, satır tamponu ister
Beyaz dengesi, gamaRenk ve ton eşlemesiBasit ama piksel başına; akışı durdurmadan yapılmalı
Gürültü azaltmaSinyali koruyup gürültüyü bastırırEn pahalı blok; paralel işleme burada kazandırır
KontrastYerel histogram eşitlemeKaro tabanlı, kare boyunca durumu taşır
KeskinleştirmeKenar kazancıGürültüyü de büyüttüğü için sıralaması kritik
RGB → YUV 4:2:0Kodlayıcının girdi formatıKodlayıcıya giden yolun son adımı

Blokları birbirine AXI4-Stream ile bağlarız. Bu arabirimin adres kavramı yoktur; veri sürekli akar ve alıcı hazır değilse tready sinyaliyle akışı yavaşlatır. Yani zincirde hiçbir blok “sonra bakarım” diyemez. Piksel geldiğinde işlenir ve geldiği hızda çıkar.

Parametreler ise işlemci tarafındaki uygulamadan AXI4-Lite ile güncellenir. Görüntü akmaya devam ederken kullanıcı eşik ve kazanç değerlerini değiştirebilir. Bu ayrım, FPGA-SoC mimarisinin görüntü işlemede en çok işe yarayan tarafıdır: veri yolu programlanabilir mantıkta, karar ve kontrol işlemcide.

Sıra neden bu kadar önemli?

Aynı blok kümesini farklı sırayla dizdiğinizde çok farklı görüntüler elde edersiniz. En belirgin örnek kontrast ile gürültü azaltmanın sırasıdır.

Zincirde sıra: aynı bloklar, farklı sonuç Zincirde sıra: aynı bloklar, farklı sonuç

Yerel kontrast blokları, düz bölgelerdeki küçük parlaklık farklarını büyütür. Sorun şu ki gürültü de tam olarak budur: düz bölgelerdeki küçük parlaklık farkları. Kontrastı önce uygularsanız gürültüyü de birlikte yükseltirsiniz. Keskinleştirme bunu bir kez daha büyütür. Zincirin sonuna koyduğunuz filtre artık gürültüyü değil, gürültüye dönüşmüş dokuyu bastırmak zorunda kalır ve bu işlemde detay gider.

Gürültü azaltmayı öne aldığınızda ise kontrast bloğu sinyali yükseltir, gürültüyü değil.

Keskinleştirme tarafında da benzer bir denge var. Kenar kazancını artırdığınızda keskinlik bir noktaya kadar artar, sonra doyar; halo ise artmaya devam eder. Bu yüzden kazancı zincirin en sonunda ve ölçerek ayarlamak gerekir.

Çalışan kural basit: gürültüyü zincire girmeden bastırın, kazancı en sona bırakın.

Gürültü nereden geliyor?

Görüntü gürültüsünün tek bir kaynağı yok. Foton gürültüsü fizikten gelir ve sensörü değiştirerek yok edemezsiniz; sinyal zayıfladıkça göreli olarak büyür. Okuma gürültüsü elektronik zincirin kendisinden gelir. Sabit desen gürültüsü ise pikselden piksele değişen küçük kazanç ve ofset farklarından doğar ve karelerden kareye aynı yerde durur.

Bu ayrım pratikte çok işe yarar. Sabit desen gürültüsü kareler boyunca aynı olduğu için kalibrasyonla düzeltilebilir. Foton ve okuma gürültüsü ise karelerden kareye rastgele değişir; bunları ancak filtreleyerek azaltabilirsiniz.

Düşük ışıkta hepsi aynı anda zorlaşır: sinyal azalır, gürültü aynı kalır, sinyal-gürültü oranı düşer. Kazanç artırmak ikisini birden büyüttüğü için tek başına çözüm değildir.

Uzamsal mı, zamansal mı?

Gürültü rastgele olduğu için ortalamasını almak onu azaltır. Sorun, ortalamayı nereden alacağınızdır: aynı karedeki komşu piksellerden mi, yoksa önceki karelerden mi?

Gürültü azaltma: uzamsal mı, zamansal mı? Gürültü azaltma: uzamsal mı, zamansal mı?

Uzamsal filtre aynı karede kalır. Komşu pikselleri kullanır, birkaç satırlık BRAM tamponu ister ve hareketten hiç etkilenmez. Karşılığında detayı da ortalar: gürültüyle birlikte gerçek dokuyu da yumuşatır.

Zamansal filtre önceki kareye bakar. Aynı pikselin zaman içindeki değerlerini ortalar. Sahne durağansa sonuç çok güçlüdür, çünkü gerçek detay karelerden kareye sabit kalırken gürültü değişir. Ama sahne hareket ediyorsa aynı piksel artık aynı nesneyi göstermiyordur ve ortalama almak iz bırakır.

Maliyetleri de farklıdır. Uzamsal filtre DSP ve BRAM harcar. Zamansal filtre ise tam bir kare tamponu ister; 1920x1080 8-bit luma için bu kare başına 2.073.600 bayttır ve her kare bir okuma ile bir yazma anlamına gelir.

Pratikte ikisi birlikte kullanılır: hafif bir uzamsal taban, üstüne hareket eşikli bir zamansal kazanç.

Zamansal filtre nasıl kurulur?

Zamansal filtrenin tek zor sorusu şudur: önceki kare nereden gelecek?

Zamansal filtre: önceki kare nereden geliyor? Zamansal filtre: önceki kare nereden geliyor?

Canlı akış zincirde ilerlerken, aynı akıştan bir kopya kare tamponuna yazılır. Bir sonraki karede bu kopya geri okunur ve çekirdeğe ikinci girdi olarak verilir. Çekirdek her piksel için |cur − prev| farkını hesaplar, bir hareket penceresi içinde eşikle karşılaştırır ve karar verir: hareket yoksa iki kareyi karıştırır, hareket varsa geçerli kareyi olduğu gibi geçirir.

Kare tamponunu nereye koyduğunuz önemli. Bu tampon sürekli ve düzenli trafik üretir; sistemin geri kalanıyla aynı bellek üzerinde yarışırsa hem kendisi hem de diğer bloklar zarar görür. Mümkünse ayrı bir bellek bölgesi ayırmak, zamansal filtreyi sistemin geri kalanına dokunmadan eklemenin en temiz yoludur.

Ayarın tamamı eşikte toplanır. Eşik yoksa hareketli nesneler iz bırakır. Eşik çok yüksekse filtre neredeyse hiç devreye girmez ve gürültü kalır. Doğru değer sahneye ve sensöre göre değiştiği için eşiği çalışma anında değiştirilebilir tutmak işe yarar.

Gerçek zamanlı çalışmanın getirdiği kısıt

Görüntü işleme zincirini FPGA’de kurmanın asıl zorluğu algoritma değil, zamanlamadır.

Gerçek zamanlı bütçe Gerçek zamanlı bütçe

1920x1080 60 fps, saniyede 124,4 milyon piksel demektir. Saat çevrimi başına 4 piksel işleyen bir zincirde bu, saniyede 31,1 milyon beat’e karşılık gelir. Bir kare için toplam süreniz 16,67 ms’dir ve bu süre pazarlığa açık değildir.

Akış zinciri bir bütçe değil, bir boru hattıdır. Bir blok duraklar ve kaybettiği çevrimleri geri vermezse, önündeki FIFO dolar, tready düşer ve geri basınç zincirin başına doğru ilerler. Bu yüzden zincirdeki her bloğun sabit gecikmeyle çalışması bir tercih değil, zorunluluktur.

Bu kısıtın mimariye etkisi başlı başına bir konu: hangi bloğun satır gecikmesiyle, hangisinin tam kare gecikmesiyle çalıştığı, gecikmenin sistemde nerede toplandığı ve kartta nasıl ölçüldüğü. Bunları ayrı bir yazıda ele alacağız.

Sonuç

FPGA üzerinde görüntü işleme, tek tek algoritmaları donanıma çevirmekten ibaret değil. Asıl iş, bu blokların hangi sırayla duracağına ve her birinin akışa ne kadar dokunabileceğine karar vermekte.

Sıralama görüntünün kalitesini belirliyor. Gürültü azaltma stratejisi, uzamsal ve zamansal yaklaşımların hangi oranda birleştiğine göre şekilleniyor. Gerçek zamanlı bütçe ise hepsinin üzerinde duruyor: bir bloğun ne kadar iyi çalıştığı, akışı hiç aksatmadan çalıştığı sürece anlamlı.

Bize ulaşın: info@run-x.com | www.run-x.com

Bu makaleyi paylaş: