HİSTOGRAM NEDİR?
Histogramı bir görüntünün yoğunluk dağılımı hakkında genel bilgi veren bir grafik veya alan olarak düşünebilirsiniz. Histogram görüntüyü analiz etmenin başka bir yoludur.
Görüntünün histogramına bakılarak o görüntünün parlaklık, kontrast, yoğunluk dağılımı vb. gibi bilgiler elde edinebilirsiniz.
Histogramla ilgili daha detaylı bilgi almak için buradan yardım alabilirsiniz.
Histogram grafiği gri skaladaki resimler için bulunabilir.Yukarıdaki resimde histogram grafiğine bakıldığında sol taraftaki alan daha koyu piksellerin miktarını,sağ taraftaki alan ise daha parlak piksellerin miktarını göstermektedir.
HİSTOGRAM BULMAK
Histogram bulma açısından hem OpenCV hemde Numpy kütüphaneleri ayrı ayrı işlevlere sahiptir.Bu işlevleri kullanmadan önce histogramla ilgili bazı terminolojileri anlamak gerekmektedir;
➤BINS: Yukarıdaki resimde her bir piksel için 0 ile 255 arasındaki yoğunluğunu gösterir. Eğer belirli yoğunluk değerindeki pikselleri ayrı ayrı göstermemiz istenirse ÖRN: 0-15,16-31...240-255 gibi. Ölçeklendirme parametresini 16 olarak ayarlamak gerekmektedir.Böylece 16 ayrı ölçeklendirme yapılacaktır.Yapılan 16 ölçeklendirmeden her birine BIN denir. BINS parametresi OpenCV'de histsize ile temsil edilir.
➤DIMS: Veriyi topladığımız parametre sayısıdır.burada bu parametre 1 yapılarak veri toplama işlemi sağlanılır.
➤ARALIK: Ölçmek istenilen yoğunluk değeri aralığıdır.Normal ayarlarında [0,255] arası değerleri bulacak şekilde ayarlanmıştır.
1)OpenCV'de Histogram Hesabı
Histogram bulmak için OpenCV'de cv2.calcHist() fonksiyonu kullanılır.
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
➤images: uint8 veya float32 türünde histogramı bulunacak kaynak görüntüdür.
➤channels: Histogram hesaplanan kanal dizinidir.Köşeli parantez içerisinde yazılmalıdır. Örneğin histogramı bulunacak kaynak görüntü gri skalada ise bu değer [0]dır. Renkler kanalları mavi,yeşil,kırmızı içinde bu değer sırasıyla [0],[1],[2] dir.
➤mask: Maske resmidir. Tam görüntünün histogramını bulmak için None (yok) kabul edilmelidir. Ancak görüntünün belirli bir bölgesinin histogramı bulunması isteniyorsa bunun için bir maske resmi oluşturulmak zorundadır.
➤histSize: BIN sayısını temsil eder. Köşeli parantez içinde yazılmalıdır.
➤ranges: Histogram aralığıdır. O değerler arasındaki piksel yoğunluklarını bulur.
Bir örnek vermek gerekirse bir resimin [0,256] arasındaki histogramını bulan kod;
img = cv2.imread('home.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist = cv2.calcHist([img],[0],None,[256],[0,256])
2)OpenCV'de Histogram Hesabı
Histogram bulmak için Numpy kütüphanesinde np.histogram() fonksiyonu kullanılır.
hist,bins = np.histogram(img.ravel(),256,[0,255])
HİSTOGRAM ÇİZDİRMEK
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg',0)
cv2.imshow('img',img)
plt.hist(img.ravel(),256,[0,256]); plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg',0)
cv2.imshow('img',img)
plt.hist(img.ravel(),256,[0,256]); plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg')
cv2.imshow('img',img)
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg')
cv2.imshow('img',img)
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
MASKE UYGULAMASI
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpeg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
Resim x ekseninde 100-400 arası ve y ekseninde 100-300 arası maskelenerek histogram eğrileri çizdirilmiştir
0 yorum:
Yorum Gönder