· Hakan Çelik · OpenCV / İleri Konular · 3 dk okuma
Histogram Eşitleme

OpenCV Serisi 24/64
- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
- 20. Şablon Eşleştirme
- 21. Hough Doğru Dönüşümü
- 22. Hough Daire Dönüşümü
- 23. Fourier Dönüşümü
- 24. Histogram Eşitleme
- 25. 2B Histogramlar
- 26. Histogram Geri Projeksiyonu
- 27. Kontur Özellikleri
- 28. Kontur Nitelikleri
- 29. Konturlerle Daha Fazla İşlev
- 30. Kontur Hiyerarşisi
- 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
- 32. Watershed Algoritması ile Görüntü Segmentasyonu
- 33. Özellikleri Anlamak
- 34. Harris Köşe Tespiti
- 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
- 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
- 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
- 38. Köşe Tespiti için FAST Algoritması
- 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
- 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
- 41. Özellik Eşleştirme
- 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
- 43. Meanshift ve Camshift ile Nesne Takibi
- 44. Optik Akış
- 45. Arka Plan Çıkarma
- 46. Kamera Kalibrasyonu
- 47. Poz Tahmini
- 48. Epipolar Geometri
- 49. Stereo Görüntülerden Derinlik Haritası
- 50. k-En Yakın Komşuyu Anlamak
- 51. kNN ile El Yazısı OCR
- 52. SVM'yi Anlamak
- 53. SVM ile El Yazısı OCR
- 54. K-Ortalamalar Kümeleme'yi Anlamak
- 55. OpenCV'de K-Ortalamalar Kümeleme
- 56. Görüntü Gürültü Giderme
- 57. Görüntü Onarımı (Inpainting)
- 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
- 59. Haar Cascade ile Yüz Tespiti
- 60. pip ile OpenCV Kurulumu
- 61. Ubuntu'da OpenCV-Python Kurulumu
- 62. Fedora'da OpenCV-Python Kurulumu
- 63. Windows'ta OpenCV-Python Kurulumu
- 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?
Histogram Eşitleme
Hedefler
Bu bölümde öğrenecekleriniz:
- Histogram eşitleme kavramı
- Görüntülerin kontrastını iyileştirmek için kullanmak
Teori
Piksel değerlerinin yalnızca belirli bir aralıkla sınırlı olduğu bir görüntüyü düşünün. Örneğin daha parlak bir görüntü, piksellerinin tamamını yüksek değerlerde barındıracaktır. Ancak iyi bir görüntünün pikselleri görüntünün tüm bölgelerinden gelir. Bu nedenle histogramı her iki uca doğru uzatmanız gerekir — Histogram Eşitlemenin kısaca yaptığı şey budur. Bu genellikle görüntünün kontrastını iyileştirir.

Daha fazla bilgi için Wikipedia’daki Histogram Eşitleme sayfasını okumanızı öneririm. Burada NumPy uygulamasını ve ardından OpenCV fonksiyonunu göreceğiz.
NumPy ile Histogram Eşitleme
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('wiki.jpg', cv.IMREAD_GRAYSCALE)
assert img is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
cdf = hist.cumsum()
cdf_normalized = cdf * float(hist.max()) / cdf.max()
plt.plot(cdf_normalized, color='b')
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')
plt.show()
Histogramın daha parlak bölgede yer aldığını görebilirsiniz. Tam bir spectrum elde etmemiz gerekiyor. Bunun için parlak bölgedeki giriş piksellerini tam bölgedeki çıkış piksellerine eşleyen bir dönüşüm fonksiyonuna ihtiyaç duyarız. Histogram eşitlemenin yaptığı tam da budur.
Şimdi minimum histogram değerini bulun (0 hariç) ve histogramı eşitleyin:
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
cdf = np.ma.filled(cdf_m, 0).astype('uint8')Artık her giriş piksel değeri için çıkış piksel değerini veren bir arama tablosuna sahibiz. Dönüşümü uygulayın:
img2 = cdf[img]Histogram ve kümülatif dağılım fonksiyonu (CDF) hesaplanır ve sonuç aşağıdaki gibi görünür:

Önemli bir özellik: görüntü daha parlak yerine daha karanlık olsa bile eşitlemeden sonra neredeyse aynı sonucu elde ederiz. Bu nedenle bu yöntem, tüm görüntüleri aynı aydınlatma koşullarına getirmek için bir “referans aracı” olarak kullanılır. Örneğin yüz tanımada, yüz verileri eğitilmeden önce görüntüler histogram eşitlemeye tabi tutulur.
OpenCV ile Histogram Eşitleme
OpenCV bunun için cv2.equalizeHist() fonksiyonuna sahiptir. Giriş yalnızca gri tonlamalı görüntüdür ve çıktı histogram eşitlenmiş görüntüdür:
img = cv.imread('wiki.jpg', cv.IMREAD_GRAYSCALE)
assert img is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
equ = cv.equalizeHist(img)
res = np.hstack((img, equ)) # Görüntüleri yan yana yerleştir
cv.imwrite('res.png', res)
Histogram eşitleme, histogramın belirli bir bölgeyle sınırlı olduğu görüntülerde iyi çalışır. Histogramın büyük bir bölgeyi kapsadığı (hem parlak hem karanlık piksellerin bulunduğu) yerlerde iyi çalışmaz.
CLAHE (Kontrast Sınırlı Adaptif Histogram Eşitleme)
Az önce gördüğümüz ilk histogram eşitleme, görüntünün global kontrastını dikkate alır. Birçok durumda bu iyi bir fikir değildir. Örneğin aşağıdaki görüntü, bir girdi görüntüsünü ve global histogram eşitleme sonrasındaki sonucunu göstermektedir:

Arka plan kontrastı histogram eşitlemeden sonra iyileşmiş olsa da her iki görüntüdeki heykel yüzünü karşılaştırın. Aşırı parlaklık nedeniyle buradaki bilgilerin çoğunu kaybettik. Bunun nedeni, histogramın önceki durumların aksine belirli bir bölgeyle sınırlı olmamasıdır.
Bu sorunu çözmek için adaptif histogram eşitleme kullanılır. Bu yöntemde görüntü, OpenCV’de varsayılan olarak 8×8 boyutunda “döşemeler” (tile) adı verilen küçük bloklara bölünür. Ardından bu blokların her biri normal şekilde histogram eşitlemeye tabi tutulur. Küçük bir alanda histogram belirli bir bölgeyle sınırlı olacaktır (gürültü yoksa). Gürültü varsa yükseltilir. Bunu önlemek için kontrast sınırlama uygulanır: herhangi bir histogram çubuğu belirli bir kontrast sınırının üzerindeyse (OpenCV’de varsayılan 40), bu pikseller kırpılır ve histogram eşitlemeden önce diğer çubuklara eşit biçimde dağıtılır. Eşitlemeden sonra, döşeme sınırlarındaki yapay izleri kaldırmak için bilineer enterpolasyon uygulanır.
CLAHE’yi OpenCV’de nasıl uygulayacağınız:
import numpy as np
import cv2 as cv
img = cv.imread('tsukuba_l.png', cv.IMREAD_GRAYSCALE)
assert img is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
# CLAHE nesnesi oluştur (argümanlar isteğe bağlıdır)
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(img)
cv.imwrite('clahe_2.jpg', cl1)Sonucu aşağıda görebilirsiniz; özellikle heykel bölgesiyle yukarıdaki sonuçları karşılaştırın:

Hakan Çelik


