Python影像處理丨基於OpenCV和像素處理的影像灰度化處理
摘要:本篇文章講解影像灰度化處理的知識,結合OpenCV調用cv2.cvtColor()函數實現影像灰度操作,使用像素處理方法對影像進行灰度化處理。
本文分享自華為雲社區《[Python影像處理] 十四.基於OpenCV和像素處理的影像灰度化處理》,作者: eastmount 。
本篇文章講解影像灰度化處理的知識,結合OpenCV調用cv2.cvtColor()函數實現影像灰度操作,使用像素處理方法對影像進行灰度化處理。基礎性知識希望對您有所幫助。
- 1.影像灰度化原理
- 2.基於OpenCV的影像灰度化處理
- 3.基於像素操作的影像灰度化處理
一.影像灰度化原理
像灰度化是將一幅彩色影像轉換為灰度化影像的過程。彩色影像通常包括R、G、B三個分量,分別顯示出紅綠藍等各種顏色,灰度化就是使彩色影像的R、G、B三個分量相等的過程。灰度影像中每個像素僅具有一種樣本顏色,其灰度是位於黑色與白色之間的多級色彩深度,灰度值大的像素點比較亮,反之比較暗,像素值最大為255(表示白色),像素值最小為0(表示黑色)。
假設某點的顏色由RGB(R,G,B)組成,常見灰度處理演算法如表7.1所示:
表7.1中Gray表示灰度處理之後的顏色,然後將原始RGB(R,G,B)顏色均勻地替換成新顏色RGB(Gray,Gray,Gray),從而將彩色圖片轉化為灰度影像。
一種常見的方法是將RGB三個分量求和再取平均值,但更為準確的方法是設置不同的權重,將RGB分量按不同的比例進行灰度劃分。比如人類的眼睛感官藍色的敏感度最低,敏感最高的是綠色,因此將RGB按照0.299、0.587、0.144比例加權平均能得到較合理的灰度影像,如公式7.1所示。
二.基於OpenCV的影像灰度化處理
在日常生活中,我們看到的大多數彩色影像都是RGB類型,但是在影像處理過程中,常常需要用到灰度影像、二值影像、HSV、HSI等顏色,OpenCV提供了cvtColor()函數實現這些功能。其函數原型如下所示:
dst = cv2.cvtColor(src, code[, dst[, dstCn]])
- src表示輸入影像,需要進行顏色空間變換的原影像
- dst表示輸出影像,其大小和深度與src一致
- code表示轉換的程式碼或標識
- dstCn表示目標影像通道數,其值為0時,則有src和code決定
該函數的作用是將一個影像從一個顏色空間轉換到另一個顏色空間,其中,RGB是指Red、Green和Blue,一副影像由這三個通道(channel)構成;Gray表示只有灰度值一個通道;HSV包含Hue(色調)、Saturation(飽和度)和Value(亮度)三個通道。在OpenCV中,常見的顏色空間轉換標識包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS等。
下面是調用cvtColor()函數將影像進行灰度化處理的程式碼。
#encoding:utf-8 import cv2 import numpy as np #讀取原始圖片 src = cv2.imread('miao.png') #影像灰度化處理 grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #顯示影像 cv2.imshow("src", src) cv2.imshow("result", grayImage) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
輸出結果如下圖所示,左邊是彩色的苗族服飾原圖,右邊是將彩色影像進行灰度化處理之後的灰度圖。其中,灰度圖將一個像素點的三個顏色變數設置為相當,R=G=B,此時該值稱為灰度值。
同樣,可以調用 grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) 核心程式碼將彩色影像轉換為HSV顏色空間,如下圖所示。
下面Image_Processing_07_02.py程式碼對比了九種常見的顏色空間,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,並循環顯示處理後的影像。
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始影像 img_BGR = cv2.imread('miao.png') #BGR轉換為RGB img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB) #灰度化處理 img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) #BGR轉HSV img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) #BGR轉YCrCb img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) #BGR轉HLS img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) #BGR轉XYZ img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) #BGR轉LAB img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) #BGR轉YUV img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) #調用matplotlib顯示處理結果 titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV'] images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb, img_HLS, img_XYZ, img_LAB, img_YUV] for i in xrange(9): plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
其運行結果如圖所示:
三.基於像素操作的影像灰度化處理
前面講述了調用OpenCV中cvtColor()函數實現影像灰度化的處理,接下來講解基於像素操作的影像灰度化處理方法,主要是最大值灰度處理、平均灰度處理和加權平均灰度處理方法。
1.最大值灰度處理方法
該方法的灰度值等於彩色影像R、G、B三個分量中的最大值,公式如下:
其方法灰度化處理後的灰度圖亮度很高,實現程式碼如下。
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始影像 img = cv2.imread('miao.png') #獲取影像高度和寬度 height = img.shape[0] width = img.shape[1] #創建一幅影像 grayimg = np.zeros((height, width, 3), np.uint8) #影像最大值灰度處理 for i in range(height): for j in range(width): #獲取影像R G B最大值 gray = max(img[i,j][0], img[i,j][1], img[i,j][2]) #灰度影像素賦值 gray=max(R,G,B) grayimg[i,j] = np.uint8(gray) #顯示影像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結果如下圖所示,其處理效果的灰度偏亮。
2.平均灰度處理方法
該方法的灰度值等於彩色影像R、G、B三個分量灰度值的求和平均值,其計算公式如下所示:
平均灰度處理方法實現程式碼如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始影像 img = cv2.imread('miao.png') #獲取影像高度和寬度 height = img.shape[0] width = img.shape[1] #創建一幅影像 grayimg = np.zeros((height, width, 3), np.uint8) print grayimg #影像平均灰度處理方法 for i in range(height): for j in range(width): #灰度值為RGB三個分量的平均值 gray = (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2])) / 3 grayimg[i,j] = np.uint8(gray) #顯示影像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結果如下圖所示:
3.加權平均灰度處理方法
該方法根據色彩重要性,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度影像。
加權平均灰度處理方法實現程式碼如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始影像 img = cv2.imread('miao.png') #獲取影像高度和寬度 height = img.shape[0] width = img.shape[1] #創建一幅影像 grayimg = np.zeros((height, width, 3), np.uint8) print grayimg #影像平均灰度處理方法 for i in range(height): for j in range(width): #灰度加權平均法 gray = 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2] grayimg[i,j] = np.uint8(gray) #顯示影像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結果如下圖所示:
參考文獻:
- 楊秀璋等. 基於苗族服飾的影像銳化和邊緣提取技術研究[J]. 現代電腦,2018(10).
- 《數字影像處理》(第3版),岡薩雷斯著,阮秋琦譯,電子工業出版社,2013年.
- 《數字影像處理學》(第3版),阮秋琦,電子工業出版社,2008年,北京.
- 《OpenCV3編程入門》,毛星雲,冷雪飛,電子工業出版社,2015.
- Opencv學習(十六)之顏色空間轉換cvtColor()
- python+opencv+影像特效(影像灰度處理、顏色翻轉、圖片融合,邊緣檢測,浮雕效果,顏色映射)
該系列在github所有源程式碼: