1.初識影像長條圖

1.1.關於影像長條圖的3個基本觀念

DIMS:表繪製長條圖時,蒐集參數的數量。通常蒐集的資料為灰階值,因此該值為1。

RANGE:要統計的灰階值範圍,通常為0~255。

BINS:參數子級的數目,也就是將要分析的像素分成幾組。


1.2.灰階值的長條圖

1.2.1.輸出結果說明

以Lenna圖片進行實作,img為灰階圖,再從長條圖可看出此圖片灰階值分布狀況。

<source:Greatway9999>


<source:Greatway9999>

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.何謂均衡化的長條圖?

均衡化的長條圖,意味該圖擁有全部可能的灰階值,且像素值分布均勻,影像就具有高比較和多變的灰階色調,外觀上具有豐富層次,不會過亮或過暗。

步驟:

  1. 計算累計長條圖。
  2. 對累計長條圖進行區間轉換。

2.2. 均衡化原理

有2種方式:

  1. 在原有範圍內均衡化:用目前灰階值的累計機率乘以目前灰階值的最大值(ex.180),藉以獲得新的灰階值,作為均衡化的結果。
  2. 在更廣泛範圍內均衡化:用目前灰階值的累計機率乘以更廣泛範圍灰階值的最大值(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 留言