天天看點

opencv-python 學習筆記(7) ------直方圖

opencv-python 學習筆記(7)

------直方圖

7.1 灰階直方圖

7.1.1 原理

直方圖是對資料進行統計的一種方法,并将統計值組織到一系列定義好的直條中。圖像直方圖(Image Histogram)是用來表示圖像中亮度分布的直方圖,标繪了圖像中每個亮度值的像素個數。在這種直方圖中,通常沿橫坐标從左到右亮度逐漸增大,如下圖。

opencv-python 學習筆記(7) ------直方圖

(注:直方圖是根據灰階圖來生成的。)

直方圖的一些術語和細節:

dims:需要統計的特征數目。例如,某直方圖隻統計了灰階值,dims=1;

bins:每個特征空間子區段的數目,即直方圖的直條數目;

range:要統計特征的取值範圍,例如,灰階值的range=[0,255].

7.1.2 直方圖的計算與繪制

使用cv2統計,使用matplotlib繪制。

代碼:

參數:

images:圖像,當傳入函數時應該用[]括起來,如:[img];

channels:若圖像為灰階圖,則為[0],若為彩圖,可為[0],[1],[2],分别對應B,G,R。

mask:是一個大小和image一樣的np數組,其中把需要處理的部分指定為1,不需要處理的部分指定為0,一般設定為None,表示處理整幅圖像;

histSize:BIN的數目,也需用中括号括起來,如:[111];

ranges:像素值的範圍,一般為[0,255].

例子:

import  cv2
from  matplotlib  import  pyplot as plt

img=cv2.imread('1.jpg')
ni=cv2.calcHist(images=[img],channels=[0],mask=None,histSize=[256],ranges=[0,256])
plt.figure(figsize=(10,6),dpi=100)
plt.plot(ni)
plt.grid()
plt.show()
           

結果:

opencv-python 學習筆記(7) ------直方圖

7.1.3 掩模的應用

定義:

掩膜是用標明的圖像或物體,對要處理的圖形進行遮擋,來控制圖像處理的區域。在cv2中,我們使用二維矩陣數組進行掩膜,1的區域被處理,0的被屏蔽,不會處理。

用途:

提取感興趣的區域;

屏蔽某些不需要處理的區域;

結構特征提取:用相似行變量或圖像比對方法檢測和提取圖像中與掩膜相似的結構特征;

特殊形狀圖像制作。

例子:

import  cv2
from  matplotlib  import  pyplot as plt
import numpy as np

# 建立mask
img = cv2.imread('2.jpg', 0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=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.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()
           

結果:

opencv-python 學習筆記(7) ------直方圖

7.2 直方圖均衡化

定義

:就是把原始圖像的灰階直方圖從某個比較集中的灰階區間變成更廣泛灰階範圍内的分布。即對圖像進行非線性拉伸,重新配置設定圖像像素值,使一定灰階範圍内的像素數量大緻相同,如下圖。

opencv-python 學習筆記(7) ------直方圖

優點:提高圖像整體的對比度,還可以在曝光過度或不足的圖像中更好的突出細節。

代碼:cv2.equalizeHist(src)

參數:src:圖像

7.3 自适應的直方圖均衡化

定義:

普通的直方圖均衡化,我們考慮的是圖像的全局對比度,這樣容易丢失許多資訊。

為了解決這個問題,我們需要使用自适應的直方圖均衡化。此時,整幅圖像會被分成很多小塊,這些小塊被稱為"tiles"(在 OpenCV中tiles的大小預設是8x8),然後再對每一個小塊分别進行直方圖均衡化)。如果有噪聲的話,噪聲會被放大。為了避免這種情況的出現要使用對比度限制。

最後為了去除每一個小塊之間的邊界,再使用雙線性內插補點,對每一小塊進行拼接。

代碼:

參數:

clipLimit:對比度限制,預設是40;

tileGirdSize:分塊的大小,預設是8X8.

繼續閱讀