Ana içeriğe atla

CLAHE (Contrast Limited Adaptive Histogram Equalization) Histogram Eşitleme Tekniği

Bu yazıda CLAHE algoritmasını nasıl uygulayacağımızı ve verilen bir resmi histogram eşitlemesi için nasıl işleyeceğimizi öğreneceğiz. Bu yazıda, CLAHE algoritmasının, görüntü iyileştirme için nasıl uygulandığını göreceğiz. CLAHE, görüntü kontrast değerlerinin aşırı yüksekliği ile ilgilenen AHE algoritmasının bir varyantıdır. CLAHE, bütün resim üzerinde işlem yapmak yerine kesitler olarak adlandırılan küçük bölgeler üzerinde işlem yapar. Küçük kesitlerde yapılan işlem sonrasında oluşan yapay sınırları kaldırmak için bilinear interpolasyon işlemi uygulanarak bu küçük kesitler birleştirilerek son görüntü elde edilir. 

Bu algoritma görüntü kontrastını iyileştirmek için kullanılabilir. CLAHE algoritmasını renkli görüntülere de uygulayabiliriz. Genelde HSV görüntülerin yalnızca parlaklık kanalına uygulandığı durumlarda, tüm RGB kanallara uygulamaktan çok daha başarılı sonuçlar elde etmemizi sağlar. 

CLAHE algoritması uygulanırken 2 parametre önemlidir. Birincisi clipLimit parametresidir. Bu parametre bizim kontrast eşik değerimizi ifade eder. Varsayılan değeri 40 olarak belirlenmiştir. İkinci parametremiz tileGridSize ise görüntünün kaç adet kesit halinde bölütleneceğidir. Varsayılan olarak 8x8 olacak şekilde bölütlenir.

 OpenCV kütüphanesi sayesinde çok detaylara inmeden sadece ilgili parametreleri belirleyerek CLAHE algoritmasını kullanabiliriz. Ben burada Python üzerinden örnek göstereceğim. Görüntü olarak da, sonuçları daha net görebilmek adına meşhur Lenna görselinin gri versiyonunu kullanacağım.

Şimdi OpenCV kütüphanesi ile bu görüntüye, clipLimit parametresi 1, 2, 3 olacak şekilde CLAHE algoritmasını uygulayalım. tileGridSize parametresine karışmıyoruz. Tabii görüntüyü yüklediğimiz zaman boyutları (512, 512, 3) olacaktır. CLAHE algoritmasını uygulayabilmek için OpenCV ile (512, 512, 1) boyutlarına getirip algoritmayı uyguluyoruz.

Evet gördüğünüz gibi clipLimit değeri arttıkça daha keskin çizgiler oluşmaya başladı (görsele tıklayarak detaylı inceleyebilirsiniz). Gölgeler ve bazı ayrıntılar daha belirgin oldu. Ancak çok yüksek değerler görselde bozulmalara sebep olabilir. Uygun değeri deneme yanılmayla bulabiliriz. 

Son blog yazımı 2021 yılında paylaşmışım. Aslında bir sürü taslak var, ancak üşengeçlikten hep yarıda kalmışlar veya detaylara inememişim. Ama mümkünse kısa kısa da olsa yazılarımı paylaşmaya çalışacağım artık. O halde bir başka yazıda buluşma temennisinde bulunarak yazıyı tamamlayalım (dedi ve 5 yıl sonra yazdı).

Yorumlar

Bu blogdaki popüler yayınlar

Python Soket Programlama

Merhaba arkadaşlar. Bugün sizlerle birlikte Python'da socket programlama yapacağız. Bunun için Python da socket kütüphanesini kullanacağız. Peki nedir bu socket programlama? Soket programlama, sizin iki program arası yada iki bilgisayar arası iletişim kurmanızı sağlar. İşte bizde bugün iki programımızı birbiri ile haberleştireceğiz. Bunun için elimizde iki program olacak. Birinci program,mesaj bekleyen program olacak, diğeri ise mesaj gönderen program.

Python Subprocess

subprocess modülü, yeni bir process oluşturmayı sağlayan, bunların girdi-çıktılarını ele alma imkânı veren ve dönüş kodlarını almayı sağlayan bir modüldür. Yani daha basit bir şekilde, program içinde program çalıştırmaya imkan veren bir modüldür. Subprocess Modülünün Kullanımı subprocess basit bazı process'leri kullanmak için birkaç tane fonksiyon sunuyor. Daha karmaşık bir process çalıştırmak isterseniz, Popen sınıfını kullanabilirsiniz. Bunlara detaylı bir şekilde değinmeye çalışacağız. Şimdi basit fonksiyonları inceleyelim

Infix to postfix dönüşümü

Infix to postfix dönüşümü, operatorün ortada olduğu a+b yazım şeklini operatorün sonda olduğu ab+ yazım şekline dönüştürme işlemidir.  Infix gösterimi, bizler için kolay bir gösterim olsa da makineler için öyle değildir. İfadeyi soldan sağa doğru okurken a + b * c işleminde önce b ile c yi çarpıp sonra da a ile toplamayı kolay bir şekilde yapabiliriz çünkü bizim ifadeyi sıra ile soldan sağa adım adım giderek okuma zorunluluğumuz yok. Önce b*c nin öncelikle olduğunu görerek oradan başlar, sonra a ile kolayca toplarız.