Image Thresholding

Bu yazımda Image Thresholding yani görüntü eşikleme işlemini anlatacağım. Fonksiyon olarak cv2.threshold ve cv2.adaptiveThreshold fonksiyonlarını göreceğiz.

En basitinden başlayacak olursak elimizde belirli bir değer olsun, görüntünün seçtiğimiz noktasındaki değeri elimizdeki değerden büyükse beyaz küçükse siyah olarak atanması gerçekleştirilir. Bu işlem için cv2.threshold fonksiyonunu kullanmamız gerekmektedir. Görüntümüzü eşikleme işlemine sokmadan önce görüntümüzün renk uzayını gri renk uzayına çevirmemiz gerekmektedir, fonksiyonun aldığı ilk girdi gri uzaydaki görüntümüzdür. İkinci girdi ise istediğimiz eşik değeridir, yani pixel değerlerini sınıflandırmak için kullanacağımız değerdir ve 127 global değerdir. Üçüncü girdi ise maksimum değerdir yani pixel değeri girdiğimiz eşik değerinden fazlaysa o pixele atanacak değerdir. Opencv kütüphanesi farkı eşikleme türlerini bize sunar, dördüncü parametre olarak da bu türlerden birisini yazarız. Bazıları

  • THRESH_BINARY
  • THRESH_BINARY_INV
  • THRESH_TRUNC
  • THRESH_TOZERO
  • THRESH_TOZERO_INV

şeklindedir. API referansına bakarsanız hepsinin açıklamasını bulabilirsiniz. Bir başka siteden aldığım örnek ise şu şekilde;

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('gradient.png',0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in xrange(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

Çıktısı ise aşağıdaki gibidir, detaylıca bakarak inceleyebilirsiniz.

Diğer bir tür eşikleme türü ise adaptive thresholding. Farklı ortamlarda çekilmiş ve farklı ışık yoğunluğuna sahip görüntüleri normal thresholding ile eşikleyemediğimiz zaman ise adaptive türü devreye giriyor. cv2.adaptiveThreshold fonksiyonuyla bu işi gerçekleştireceğiz. Bu fonksiyon ise üç adet input parametresi ve bir adet output parametresi alır.

Image thresholding için kullanılan adaptive metodlarının türlerine bakalım şimdi de;

cv2.ADAPTIVE_THRESH_MEAN_C : Eşik değeri, o alanın çevresindeki değerlerin ortalamasıyla hesaplanarak bulunur ve işlem uygulanır.

cv2.ADAPTIVE_THRESH_GAUSSIAN_C : Eşik değeri, o alanın çevresindeki değerlerin Gauss yöntemiyle ağırlıklı toplamlarının ortalaması hesaplanarak bulunur ve işlem uygulanır.

Blok boyutu : Çevre alanının büyüklü

c : Ortalamadan veya ağırlıklı ortalamadan çıkarılan sabite denir.

Hemen bir örnek koda bakarak işlemiş olduğumuz iki fonksiyonun nasıl parametreler aldıklarını görelim.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('dave.jpg',0)

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) #normal threshold
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2) #normal
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)#gauss

titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]

for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()