Python OpenCV Analisis Histogram


Pagi hari menulis research paper ditemani dengan satu gelas kopi panas. Meski menjelang Natal dan tahun baru, sepertinya tidak ada tanda-tanda libur bagi engineer. Nasib.

Sebagai sambilan dan juga refreshing, tulisan catatan ringan di blog yang kian absurd. Untuk artikel blog kali ini akan dibahas mengenai seri artikel dasar image processing dengan OpenCV dan Python. Pada bagian ini dibahas singkat mengenai histogram.

Suatu histogram memberikan garis besar informasi mengenai intensitas distribusi dari suatu image. Histogram menampilkan plot nilai pixel, disebut bin, mulai dari 0 hingga 255, untuk 8-bit, pada sumbu X dan jumlah pixel yang terkait di sumbu Y dari plot tersebut.

Beberapa hal yang perlu dipersiapkan, tentu saja OpenCV dan Python, berikutnya asumsikan file 'image.jpg' berada di satu direktori dengan file Python.




Script pertama, menampilkan histogram dari file 'image.jpg' tersebut.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg',0)
histogram = np.bincount(img.ravel(),minlength=256)
print(histogram)
plt.hist(img.ravel(),256,[0,256]);
plt.title('Histogram')
plt.xlim([0,256])
plt.show()

Berikut hasil histogram yang pertama.

Script kedua, menampilkan histogram RGB.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
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.legend(('Blue','Green','Red'), loc = 'upper right')
plt.title('Histogram')
plt.show()

Terdapat channel [0], [1], dan [2], untuk RGB. Sedangkan bila hanya menampilkan histogram gray scale cukup [0]. Berikut hasilnya.

Script ketiga, menggunakan mask untuk menentukan region dari image yang hendak dianalisis. Terkadang dalam beberapa kasus, seseorang hanya tertarik bagian tertentu dari suatu image. Dengan kata lain, bagian lainnya diabaikan dan tidak dianalisis. Langsung saja berikut script untuk masking.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg',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.title('Full Image')
plt.subplot(222), plt.imshow(mask,'gray')
plt.title('Mask')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.title('Masked')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.legend(('Full','Masked'), loc = 'upper right')
plt.title('Histogram')
plt.xlim([0,256])
plt.show()

Berikut hasilnya.


Bagian pertama selesai, lanjut ke bagian selanjutnya.