Otsu Eşik Belirleme
Normalde bir gri görüntüyü ikili biçime çevirmek için izlenecek yöntem oldukça basittir. Bir eşik değeri belirlenir ve bu eşik değerin üzerindeki renkler beyaza, altındaki renkler siyaha dönüştürülür. Ancak tüm görüntüler aynı niteliklere sahip değildir. Sabit bir eşik değeri tüm görüntüler üzerinde kabul edilebilir sonuçlar üretemeyebilir. Dolayısıyla eşik değerin, resmin renk dağılımına uygun olarak belirlenmesini sağlayacak bir yönteme ihtiyaç duyulur.
Otsu metodu, gri seviye görüntüler üzerinde uygulanabilen bir eşik tespit yöntemidir. Bu metod kullanılırken görüntünün arka plan ve ön plan olmak üzere iki renk sınıfından oluştuğu varsayımı yapılır. Daha sonra tüm eşik değerleri için bu iki renk sınıfının sınıf içi varyans değeri hesaplanır. Bu değerin en küçük olmasını sağlayan eşik değeri, optimum eşik değeridir.
VARYANS
Varyans belli bir sayı dizisinin, bu dizinin aritmetik ortalaması etrafındaki dağılımının yorumlanabilmesini sağlayan bir ölçüdür. Varyans büyükse değerlerin dağınık ve kendi ortalamalarından uzak oldukları yorumu yapılır. Küçükse, değerlerin kendi ortalamaları etrafında çok dağılmadıkları anlaşılır.
Varyans aşağıdaki şekilde hesaplanır:
Burada (Xi üssü) değeri ağırlıklı ortalamadır. Pr(Xi), ise olasılık fonksiyonudur. Bir görüntü üzerinde bir renk değerinin olasılığı basitçe, bu değerin resimdeki sayısının, toplam pixel sayısına bölümüdür. (Bir torbada 3 kırmızı 5 mavi top vardır. Rastgele çekilen bir topun kırmızı olma olasılığı kaçtır?, 3/(3+5) gibi).
OpenCV'de OTSU Metodu;
Otsu Methodu kullanılabilmesi için;
- cv2.treshold() Fonksiyonu kullanılır.
- cv2.treshold() fonksiyonun içine resime atanan değişken ismi eşik değeri ve kullanılan threshold methodları girilir.
- Otsu methodu için OpenCV'de çağırılan kod "cv2.THRESH_OTSU" komutudur.
- Otsu Methodu için resmi Binary olarak eşiklemek gerekmektedir.Dolayısıyla"cv2.THRESH_BINARY+cv2.THRESH_OTSU" çağırılırsa doğru sonuç verecektir.
ÖRNEK KOD;
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi.jpg',0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
SONUÇ;
Ders:11⬅ ➤Ders:13
güzel anlatmışsın OTSU yu moruk
YanıtlaSileyvallah sağolasın :)
Siljava ile kullanılabilirmi
YanıtlaSil