[OpenCV筆記] 11. 影像長條圖均衡化實作
1.初識影像長條圖
1.1.關於影像長條圖的3個基本觀念
DIMS:表繪製長條圖時,蒐集參數的數量。通常蒐集的資料為灰階值,因此該值為1。
RANGE:要統計的灰階值範圍,通常為0~255。
BINS:參數子級的數目,也就是將要分析的像素分成幾組。
1.2.灰階值的長條圖
1.2.1.輸出結果說明
以Lenna圖片進行實作,img為灰階圖,再從長條圖可看出此圖片灰階值分布狀況。
1.2.2.範例程式
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)
plt.hist(img.ravel(),256)
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
1.3.彩色通道的長條圖
1.3.1.輸出結果說明
如我們所知,彩色圖片會有B、G、R三通到,以長條圖的方式也可看出不同通道的灰階值分布,如下圖所示。
<source:Greatway9999>1.3.2.範例程式
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('Lenna.jpg')
hist = cv2.calcHist([img], [0], mask=None, histSize=[256], ranges=[0,255]) #參數對應位置:輸入圖片、通道、遮罩、BINS值、像素值範圍
#print(type(hist)) #hist的資料類型,為ndarray
#print(hist.shape) #hist的資料
#print(hist.size)
#print(hist)
#繪製各種通道
histb = cv2.calcHist([img], [0], mask=None, histSize=[256], ranges=[0,255])
histg = cv2.calcHist([img], [1], mask=None, histSize=[256], ranges=[0,255])
histr = cv2.calcHist([img], [2], mask=None, histSize=[256], ranges=[0,255])
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
1.4.使用遮罩的長條圖
1.4.1.輸出結果說明
若對原圖使用遮罩,長條圖會有明顯變化,也就是在特定區間內的像素值數量會降低。如下圖所示。
<source:Greatway9999>1.4.2.範例程式
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)
mask = np.zeros(img.shape, dtype = np.uint8)
mask[80:180, 80:180] = 255
hist = cv2.calcHist([img], [0], mask=None, histSize=[256], ranges=[0,255])
hist_mask = cv2.calcHist([img], [0], mask, histSize=[256], ranges=[0,255])
plt.plot(hist)
plt.plot(hist_mask)
2.長條圖均衡化
2.1.何謂均衡化的長條圖?
均衡化的長條圖,意味該圖擁有全部可能的灰階值,且像素值分布均勻,影像就具有高比較和多變的灰階色調,外觀上具有豐富層次,不會過亮或過暗。
步驟:
- 計算累計長條圖。
- 對累計長條圖進行區間轉換。
2.2. 均衡化原理
有2種方式:
- 在原有範圍內均衡化:用目前灰階值的累計機率乘以目前灰階值的最大值(ex.180),藉以獲得新的灰階值,作為均衡化的結果。
- 在更廣泛範圍內均衡化:用目前灰階值的累計機率乘以更廣泛範圍灰階值的最大值(ex.255),藉以獲得新的灰階值,作為均衡化的結果。
從以下輸出結果可看出,右圖為均衡化的結果,外觀上具有豐富層次,不會過亮或過暗。
<source:Greatway9999>下圖中的第一張圖為原圖的長條圖,第二章圖為均衡化的長條圖。
<source:Greatway9999>2.3.範例程式
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)
equal_img = cv2.equalizeHist(img)
cv2.imshow('img',img)
cv2.imshow('equal_img',equal_img)
plt.figure('原始影像長條圖')
plt.hist(img.ravel(), 256)
plt.figure('均衡化結果影像長條圖')
plt.hist(equal_img.ravel(), 256)
cv2.waitKey()
cv2.destroyAllWindows()
---
參考資料:
0 留言