Rabu, 01 Agustus 2018

Python Opencv Analisis Histogram

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

Sebagai sambilan dan juga refreshing, goresan pena 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 bab ini dibahas singkat mengenai histogram.

Suatu histogram menawarkan garis besar gosip mengenai intensitas distribusi dari suatu image. Histogram menampilkan plot nilai pixel, disebut bin, mulai dari 0 sampai 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 jikalau hanya menampilkan histogram gray scale cukup [0]. Berikut hasilnya.

Script ketiga, memakai mask untuk memilih region dari image yang hendak dianalisis. Terkadang dalam beberapa kasus, seseorang hanya tertarik bab tertentu dari suatu image. Dengan kata lain, bab 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 bab selanjutnya.
Sumber http://lang8088.blogspot.com


EmoticonEmoticon