灰度是指把白色與黑色之間按對數關系分為若干個等級,一般我們將灰度分為256階(0-255)。用灰度表示的圖像就叫做灰度圖。
一幅完整的圖像是由紅色、綠色、藍色三個通道組成的,顏色通道一般有RGB和bgr兩種,其中OpenCV中采用的顏色通道模式為bgr模式。
事實上,b(藍色)、g(綠色)、r(紅色)三個通道的縮覽圖都是以灰度顯示的,當我們用不同的灰度色階來表示b、g、r三個通道在圖像中的比重,並將它們組合在一起時,就形成了一幅完整的圖像。
通道中的純白,代表了該色光在此處為最高亮度,亮度級別為255。同理,通道中的純黑為最低亮度,亮度級別為0
圖像的灰度處理就是對圖像進行灰度化的過程,簡單來說,就是將圖像顏色從三通道變為單通道。在bgr模型中,如果b=g=r,那么表示的就是一種灰度顏色,其中b=g=r的值叫做灰度值(或叫做強度值、亮度值)。因此,灰度圖像中的每個像素只需要一個字節來存放灰度值,其中灰度范圍為0-255。
關於圖像的灰度處理,其實我們在之前的章節中已經有用到過了。我們在讀取圖像數據時使用imread(filename,flags=None)函數,該函數接收兩個參數,第一個參數為圖像名稱,第二個參數為圖像讀取方式。當flags傳入1時,讀取的為原圖像,即具有三個顏色通道的彩色圖;而當lags傳入的是0時,讀取的便是原圖像的灰度圖。
import cv2 #導入opencv庫 import numpy as np img = cv2.imread("3.jpg",1) #讀取一張圖片,彩色 dst=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #顏色空間轉換 ''' opencv中有多種色彩空間,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8種,使用中經常要遇到色彩空間的轉化,以便生成mask圖等操作 參數1 必選參數,待轉換的原圖像數據 參數2 必選參數。用於設置轉換的代碼或標識,確定從何種圖像格式轉換為另一種圖像格式 cv2.COLOR_BGR2RGB 將BGR格式轉換成RGB格式 cv2.COLOR_BGR2GRAY 將BGR格式轉換成灰度圖片 cv2.COLOR_BGR2HSV 從RGB轉到HSV夜色空間 看下表 參數3 可選參數。表示輸出圖像,即轉換后的目標圖像數據。默認大小與形狀同原圖像保持一致 參數4 可選參數。用於設置目標圖像通道數,默認取值為0,表示由參數1和參數2決定。 ''' print(dst.shape) cv2.imshow('img',img) cv2.imshow('dst',dst) cv2.waitKey() #窗口等待任意鍵盤按鍵輸入,0為一直等待,其他數字為毫秒數
參數2 代碼:
效果圖:
圖像灰度處理方法:
圖像灰度化就是將bgr模式的三通道顏色轉換為b=g=r的單通道顏色。因此,圖像的灰度化其實就是求取b=g=r=x中的x值。常用的方法有分量法、最大值法、平均值法和加權平均法四種方法對彩色圖像進行灰度化
分量法:
分量法指的是將彩色圖像中的b(藍色)、g(綠色)、r(紅色)三分量的亮度作為三個灰度圖像的灰度值,分別產生藍色分量灰度圖、綠色分量灰度圖和紅色分量灰度圖,然后根據應用需求選取其中一種分量灰度圖作為灰度圖像
最大值法:
最大值法顧名思義就是將彩色圖像中的b(藍色)、g(綠色)、r(紅色)三分量中的最大值作為灰度圖的灰度值,即將灰度圖的灰度設置為max(b,g,r)
平均值法:
平均值法與最大值法類似,取的是b(藍色)、g(綠色)、r(紅色)三分量的平均值,即將灰度圖的灰度設置為(b+g+r)/3
加權平均法:
加權平均法是圖像灰度處理用的比較多的一種實現方法,也是OpenCV默認的灰度處理方法。加權平均法會根據重要性及其它相關指標,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感度最高,對藍色的敏感度最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度圖像:
r*0.299+g*0.587+b*0.114(這里保留三位小數)。