數字圖像處理(16): 圖像顏色空間轉換 和 OpenCV圖像灰度化處理

目錄

1 圖像灰度化原理

2 圖像顏色空間轉換

3 OpenCV圖像灰度化處理

3.1 最大值灰度處理

3.2 平均灰度處理

3.3 加權平均灰度處理

參考資料


1 圖像灰度化原理

在圖像處理算法中,往往需要把彩色圖像轉換爲灰度圖像。圖像灰度化是將一幅彩色圖像轉換爲灰度化圖像的過程。彩色圖像通常包括R、G、B三個分量,分別顯示出紅綠藍等各種顏色,灰度化就是使彩色圖像的R、G、B三個分量相等的過程。灰度圖像中每個像素僅具有一種樣本顏色,其灰度是位於黑色與白色之間的多級色彩深度,灰度值大的像素點比較亮,反之比較暗,像素值最大爲255(表示白色),像素值最小爲0(表示黑色)。假設某點的顏色由RGB(R,G,B)組成,常見灰度處理算法有:

       算法名稱                           算法公式 

 最大值灰度處理

              gray=\max (R,G,B)

   浮點灰度處理

     gray=0.3R+0.59G+0.11B

   整數灰度處理

   gray=(30R+59G+11B)/100

   移位灰度處理

  gray=(28R+151G+77B)>>8

   平均灰度處理

                 gray=(R,G,B)/3

加權平均灰度處理

 gray=0.299R+0.587G+0.144B

其中,常見的灰度處理方法是將RGB三個分量求和再取平均值,但更爲準確的方法是設置不同的權重,將RGB分量按不同的比例進行灰度劃分。比如人類的眼睛感官藍色的敏感度最低,敏感最高的是綠色,因此將RGB按照0.299、0.587、0.144比例加權平均能得到較合理的灰度圖像

                                                                             gray=0.299R+0.587G+0.144B


 

2 圖像顏色空間轉換

在日常生活中,我們看到的大多數彩色圖像都是RGB類型,但是在圖像處理過程中,常常需要用到灰度圖像、二值圖像、HSV、HSI等顏色,OpenCV提供了 cvtColor() 函數實現這些功能。

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() 函數將圖像顏色空間轉換(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('zxp.jpg')

#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 range(9):
   plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:


 

3 OpenCV圖像灰度化處理

下面主要介紹最大值灰度處理平均灰度處理加權平均灰度處理 算法。

3.1 最大值灰度處理

該方法的灰度值等於彩色圖像R、G、B三個分量中的最大值,公式如下:

                                                                               gray=\max (R,G,B)

 

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('zxp.jpg')

#獲取圖像高度和寬度
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()

 

運行結果如下圖所示:(處理效果的灰度偏亮

 

 

3.2 平均灰度處理

該方法的灰度值等於彩色圖像R、G、B三個分量灰度值的求和平均值,其計算公式如下所示:

                                                                                    gray=(R,G,B)/3

 

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('zxp.jpg')

#獲取圖像高度和寬度
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.3 加權平均灰度處理

該方法根據色彩重要性,將三個分量以不同的權值進行加權平均。常見的灰度處理方法是將RGB三個分量求和再取平均值,但更爲準確的方法是設置不同的權重,將RGB分量按不同的比例進行灰度劃分。比如人類的眼睛感官藍色的敏感度最低,敏感最高的是綠色,因此將RGB按照0.299、0.587、0.144 比例加權平均能得到較合理的灰度圖像:

                                                                       gray=0.299R+0.587G+0.144B

 

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('zxp.jpg')

#獲取圖像高度和寬度
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()

 

運行結果如下圖所示:

 


 

參考資料

[1] https://blog.csdn.net/Eastmount/article/details/88785768

[2] Python+OpenCV圖像處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章