Thresholding

Kategori: Computer Vision , 21 Ocak 2020 , JanFranco


Thresholding yöntemi, pixelleri manipüle etmek için kullanılır. Bir eşik değer belirlenir ve o eşik değerin altında ve üstünde kalan pikselleri belirli kurallar belirleyerek değiştirebiliriz. Genel bir tanım yapmak biraz zor çünkü çok farklı thresholding yöntemleri mevcut. Ama tüm yöntemlerde bir veya birden fazla eşik değer belirlenir ve o eşik değere/değerlere göre hareket edilir. OpenCV kütüphanesini kullanarak, Python üzerinden görelim. İlk olarak kütüphaneyi ve resmi alalım:


import cv2

img = cv2.imread("../data/rainbow.jpg")
cv2.imshow("Rainbow", img)
cv2.waitKey(0)
>>

Thresholding"

Threshold methodlarının büyük bir çoğunluğu resmi grayscale resim olarak ister. cvtColor methodu ile resmi gri ölçeğe çevirebiliriz:


img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold methodunu kullanarak işlemlerimize başlayalım:


ret, thresh1 = cv2.threshold(src=img, thresh=127, maxval=255, type=cv2.THRESH_BINARY)
cv2.imshow("Thresh1", thresh1)
cv2.waitKey(0)
>>

Thresholding"

threshold methodu eşik değeri ve output resmi return eder. ret yerine _ yazmak daha mantıklı. Yazının ilerleyen bölümlerinde ret değişkenini kullanmayacağımız için _ sembolünü koyabiliriz. Parametreleri açıklayalım: src input resimdir, thresh eşik değerdir. maxval kurala göre değişecek piksellerin alacağı değerdir. type ise threshold yöntemidir. Önce basit threshold yöntemlerini daha sonra bu parametreler ile methodun ne iş yapacağını açıklayalım:


THRESH_BINARY
-------------
if pixel > thresh -> pixel = max_val
else pixel = 0

THRESH_BINARY_INVERSE
--------------------
if pixel > thresh -> pixel = 0
else pixel = max_val

THRESH_TRUNC
------------
if pixel > thresh -> pixel = thresh
else pixel = pixel

THRESH_TOZERO
-------------
if pixel > thresh -> pixel = pixel
else pixel = 0
Bizim verdiğimiz değerlere göre, bir pikselin değeri 127 üzeriyse değer 255 olarak değiştirilecek. Altındaysa 0 olarak değişecek. BINARY_INVERSE methodunu görelim:


_, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("Thresh2", thresh2)
cv2.waitKey(0)
>>

Thresholding"

THRESH_TRUNC methodunu görelim. Eğer eşik değeri 127, max değeri 255 belirlersek, değeri 127 üzeri pikseller 127'ye düşürülecek, diğer pikseller olduğu gibi kalacak. max değerin bir önemi yok ancak vermek zorundayız yoksa eksik parametre hatası alırız:


_, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow("Thresh3", thresh3)
cv2.waitKey(0)
>>

Thresholding"

TOZERO methodunu da görelim. Yine aynı değerleri kullanırsak, değeri 127 üzeri olan pikseller değişmeyecek, altında olan pikseller 0 olarak değiştirilecek:


_, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
cv2.imshow("Thresh4", thresh4)
cv2.waitKey(0)
>>

Thresholding"

Adaptive threshold yönteminden bahsetmek için farklı bir resim alalım. imread methoduna ikinci parametre olarak 0 girersek resmi direk grayscale resme dönüştürür:


img = cv2.imread("../data/crossword.jpg", 0)
cv2.imshow("Crossword", img)
cv2.waitKey(0)
>>

Thresholding"

İlk olarak threshold yöntemi uygulayalım:


_, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("Thresh1", thresh1)
cv2.waitKey(0)
>>

Thresholding"

adaptiveThreshold methodu ile adaptive threshold yöntemini uygulayabiliriz. Alacağı ilk parametre input resim, ikinci parametre max değer, üçüncü parametre adaptive yöntem, dördüncü parametre threshold yöntemdir. Bu yöntemde tek bir eşik değer yoktur. Beşinci parametrede verilen değere göre bir komşuluk ilişkisi oluşturulur. 15 değeri için 15x15 gibi. Genellikle arkaplan ile resim arasında fark yaratmak için kullanılan kullanışlı bir yöntemdir. 6. parametre C değeridir. C değeri adaptive yöntemlerde kullanılır. Adaptive yöntemleri açıklayalım: ADAPTIVE_THRES_MEAN_C komşuluk bölgesindeki piksellerin ortalamasını alır ve bu ortalamadan c değerini çıkararak threshold değerini hesaplar. ADAPTIVE_THRESH_GAUSSIAN_C ise bu komşuluk bölgesindeki ağırlıklar toplamını hesaplar ve bu değerden c değerini çıkararak threshold değerini hesaplar. Daha ayrıntılı bilgi için:

https://docs.opencv.org/3.4.3/d7/d4d/tutorial_py_thresholding.html


thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, 35)
cv2.imshow("Adaptive Thresh_Mean_C", thresh2)
cv2.waitKey(0)
>>

Thresholding"


thresh3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 35)
cv2.imshow("Adaptive Thresh_Gaussian_C", thresh3)
cv2.waitKey(0)
>>

Thresholding"

Son olarak Otsu Thresh methodunu görelim. Bu method genellikle bir obje ile bir arkaplan barındıran, daha spesifik olmak gerekirse histogramda iki pik noktası olan resimlerde başarılıdır. Diğer görüntülerde genellikle kötü sonuç verir. Algoritma threshold değerini, iki pik noktası arasında optimum değer bularak belirler:


_, thresh4 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("THRESH_OTSU", thresh4)
cv2.waitKey(0)
>>

Thresholding"


Sonraki Yazı: Blurring
Yorumlar

JanFranco
Merhaba, orijinal OpenCV dokümanları başlangıç için yeterli olacaktır: https://docs.opencv.org/master/d6/d00/tutorial_py_root.html

04 Haziran 2020 13:28

ahmetb
Dostum çalışmaları böyle yayınladığın için teşekkürler. Computer Vision çalışırken nasıl bir yol haritası izledin , hangi kaynakları kullandın acaba. İyi çalışmalar.

04 Haziran 2020 11:04