天天看點

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

目錄

1 直方圖均衡化簡介

1.1 直方圖均衡化概念

1.2 直方圖均衡化的理論基礎

1.3 直方圖均衡化的步驟

1.4 直方圖均衡化應用場景

2 直方圖均衡化-equalizeHist()

3 matplotlib.pyplot.subplot() 函數

4 matplotlib.pyplot.imshow() 函數

5 直方圖均衡化對比

參考資料

1 直方圖均衡化簡介

1.1 直方圖均衡化概念

直方圖均衡化 (Histogram Equalization) 就是把一個已知灰階機率密度分布的圖像經過一種變換,使之演變為一幅具有均勻灰階機率密度分布的新圖像。

如下圖所示,過暗和過亮的圖像 經過直方圖均衡化,使得圖像變得清晰。

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料
數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

1.2 直方圖均衡化的理論基礎

前提:如果一幅圖像占有全部可能的灰階級,并且均勻分布。

結論:該圖像具有高對比度和多變的灰色色調。

外觀:圖像細節豐富,品質更高。

1.3 直方圖均衡化的步驟

(1)計算累計直方圖;

(2)将累計直方圖進行區間轉換;

(3)在累計直方圖中,機率相近的原始值,會被處理為相同的值。

具體的例子如下:

如下圖所示,已知一幅圖像的像素分布為 7

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

7,根據像素值,則可以計算出統計直方圖

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

根據統計直方圖,可以算出歸一化直方圖和累計直方圖,如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

将累計直方圖進行區間轉換,如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

由上圖的結果可知,原先8個灰階級轉變成6個灰階級,那麼原始直方圖和均衡直方圖為:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

上面的灰階級是8,那灰階級轉變成256,計算方法類似,如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

同樣的,原始直方圖和均衡直方圖為:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

由上圖可以看出,雖然二者相似,但右側均衡化後的直方圖分布更均勻,相鄰像素級機率和與高機率近似相等。如果将兩張圖的灰階級放在同一區間,可以看出差别更大,如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

1.4 直方圖均衡化應用場景

(1)醫學圖像處理

(2)車牌照識别

(3)人臉識别

2 直方圖均衡化-equalizeHist()

OpenCV庫下,直方圖均衡化使用  equalizeHist() 函數,函數用法如下所示:

dst=cv2.equalizeHist(src)

其中,參數:

dst 表示處理結果

src 表示原始圖像

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)


cv2.imshow("src", img)
cv2.imshow("result", equ)


plt.hist(img.ravel(), 256)
plt.figure()
plt.hist(equ.ravel(), 256)
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:(左圖為原始灰階圖像,右圖為均衡化後的圖像)

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料
數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

3 matplotlib.pyplot.subplot() 函數

matplotlib.pyplot.subplot() 函數可以将多張圖像放在一個視窗内,Pyhton下需要導入 matplotlib.pyplot 繪圖包,其用法和Matlab中的subplot()函數用法類似。matplotlib 是一個強大的繪圖包。subplot() 函數用法如下所示:

subplot(nrows, ncols, plot_number)

其中,參數:

nrows 表示行數;

ncols  表示列數;

plot_number 表示視窗序号。

例如:排列成兩行三列的圖像,如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料
注:在實際應用中,如果每一個參數都小于10,三個數字可以連着直接寫,不加标點,如 subplot(2,3,4) 可以寫成 subplot(234)

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)

plt.subplot(221),plt.imshow(img, 'gray'),plt.title('img'), plt.xticks([]),plt.yticks([])
plt.subplot(222),plt.imshow(equ, 'gray'),plt.title('equ'), plt.xticks([]),plt.yticks([])
plt.subplot(223),plt.hist(img.ravel(),256),plt.title('img_hist')
plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist')

plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

4 matplotlib.pyplot.imshow() 函數

imshow() 函數用法如下所示,同樣的,Pyhton下需要導入 matplotlib.pyplot 繪圖包。

imshow(X, cmap=None)

其中,參數:

X 表示要繪制的圖像;

cmap 表示colormap,顔色圖譜,預設為RGB(A)顔色空間:

    1)對于灰階圖像,使用參數 “ cmap=plt.cm.gray ”;

    2)對于彩色圖像,如果使用opencv讀入的圖像,預設空間為BRG,需要調整色彩空間為RGB。

下面是分别使用函數讀取灰階圖像和彩色圖像例子。

(1)灰階圖像

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('zxp.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.subplot(221),plt.imshow(img),plt.title('img'), plt.axis('off') #坐标軸關閉
plt.subplot(222),plt.imshow(img, cmap=plt.cm.gray),plt.title('img_cmap'), plt.axis('off')

plt.subplot(223),plt.imshow(img_gray),plt.title('img_gray'), plt.axis('off')
plt.subplot(224),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray_cmap'),plt.axis('off')#正确用法


plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

(2)彩色圖像

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('zxp.jpg')
b,g,r=cv2.split(img) #通道分割
img_RGB=cv2.merge([r,g,b])#通道組合

plt.subplot(121),plt.imshow(img),plt.title('img_BGR'), plt.axis('off') #坐标軸關閉
plt.subplot(122),plt.imshow(img_RGB),plt.title('img_RGB'), plt.axis('off')
           

運作結果如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

5 直方圖均衡化對比

直方圖均衡化前後對比,使用前面提到的 matplotlib.pyplot.subplot() 函數 和 matplotlib.pyplot.imshow() 函數。

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_gray = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img_gray)

plt.subplot(221),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray'), plt.axis('off') #坐标軸關閉
plt.subplot(222),plt.imshow(equ, cmap=plt.cm.gray),plt.title('equ'), plt.axis('off') #坐标軸關閉
plt.subplot(223),plt.hist(img_gray.ravel(),256),plt.title('img_gray_hist')
plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist')

plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(17): 直方圖均衡化處理1 直方圖均衡化簡介2 直方圖均衡化-equalizeHist()3 matplotlib.pyplot.subplot() 函數4 matplotlib.pyplot.imshow() 函數5 直方圖均衡化對比參考資料

參考資料

[1] Python+OpenCV圖像處理