OpenCV+Python 彩色圖片的 BGR、灰度圖、HSV分量圖顯示的程序

OpenCV+Python 彩色圖片的 BGR、灰度圖、HSV分量圖顯示的程序

介紹

OpenCV+Python

使用openCV中的split()函數和 cvtColor()函數提取一張彩色圖片的BGR分量圖、灰度圖、HSV分量圖

軟件架構

模塊:OpenCV 4.0.0.21

編程語言:Python 3.7.2

編譯器:PyCharm 2018

先上一張效果圖

輸入圖片說明

第一行 第1張圖是原始圖片,第2張是Hue色度分量圖,第3張圖是Saturation飽和度分量圖,第4張圖是Value亮度分量

第二行 第1張圖是圖片是灰度圖,第2張圖是綠色分量圖,第3張圖是紅色分量圖,第4張圖是藍色分量圖。

所有程序代碼

# -*- coding:utf-8 -*-
#本程序用於將一張彩色圖片分解成BGR的分量顯示,灰度圖顯示,HSV分量顯示
import cv2  #導入opencv模塊
import numpy as np

print("Hellow word!")     #打印“Hello word!”,驗證模塊導入成功

img = cv2.imread("imag2.jpg")  #導入圖片,圖片放在程序所在目錄
cv2.namedWindow("imagshow", 2)   #創建一個窗口
cv2.imshow('imagshow', img)    #顯示原始圖片

"""
#使用直接訪問的方法
B = img[:, :, 0]
G = img[:, :, 1]
R = img[:, :, 2]
"""
#使用split函數分解BGR
(B, G, R) = cv2.split(img) #分離圖像的RBG分量

#以灰度圖的形式顯示每個顏色的分量
"""
cv2.namedWindow("B",2)   #創建一個窗口
cv2.imshow('B', B)       #顯示B分量
cv2.namedWindow("G",2)   #創建一個窗口
cv2.imshow('G', G)       #顯示G分量
cv2.namedWindow("R",2)   #創建一個窗口
cv2.imshow('R', R)       #顯示R分量
"""

# 生成一個值爲0的單通道數組
zeros = np.zeros(img.shape[:2], dtype = "uint8")
# 分別擴展B、G、R成爲三通道。另外兩個通道用上面的值爲0的數組填充
cv2.namedWindow("Blue",2)   #創建一個窗口
cv2.imshow("Blue", cv2.merge([B, zeros, zeros]))
cv2.namedWindow("Green",2)   #創建一個窗口
cv2.imshow("Green", cv2.merge([zeros, G, zeros]))
cv2.namedWindow("Red",2)   #創建一個窗口
cv2.imshow("Red", cv2.merge([zeros, zeros, R]))

#使用cvtColor轉換爲灰度圖
out_img_GRAY=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#將圖片轉換爲灰度圖
cv2.namedWindow("GRAY_imag",2)   #創建一個窗口
cv2.imshow('GRAY_imag', out_img_GRAY) #顯示灰度圖

#使用cvtColor轉換爲HSV圖
out_img_HSV=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#將圖片轉換爲灰度圖
hsvChannels=cv2.split(out_img_HSV)  #將HSV格式的圖片分解爲3個通道

cv2.namedWindow("Hue",2)   #創建一個窗口
cv2.imshow('Hue',hsvChannels[0]) #顯示Hue分量
cv2.namedWindow("Saturation",2)   #創建一個窗口
cv2.imshow('Saturation',hsvChannels[1]) #顯示Saturation分量
cv2.namedWindow("Value",2)   #創建一個窗口
cv2.imshow('Value',hsvChannels[2]) #顯示Value分量

cv2.waitKey(0)  #等待用戶操作

下面介紹程序的實現方法

1、導入一張圖片並顯示

img = cv2.imread("imag2.jpg")  #導入圖片,圖片放在程序所在目錄
cv2.namedWindow("imagshow", 2)   #創建一個窗口
cv2.imshow('imagshow', img)    #顯示原始圖片

cv2.imread(a,b):讀入圖片,共兩個參數;第一個參數爲要讀入的圖片文件名(包含文件路徑);第二個參數爲如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,幷包括其alpha通道。

img爲存儲圖片矩陣的變量

用法:cv2.namedWindow(‘窗口標題’,默認參數)
默認參數:cv2.WINDOW_AUTOSIZE+cv2.WINDOW_KEEPRATIO+cv2.WINDOW_GUI_EXPANDED)

參數:

  • cv2.WINDOW_NORMAL 窗口大小可改變
  • cv2.WINDOW_AUTOSIZE 窗口大小不可改變
  • cv2.WINDOW_FREERATIO 自適應比例
  • cv2.WINDOW_KEEPRATIO 保持比例餓
  • cv2.WINDOW_GUI_NORMAL
  • cv2.WINDOW_GUI_EXPANDED

用法:cv2.imshow(‘窗口標題’, image),如果前面沒有cv2.namedWindow,就自動先執行一個cv2.namedWindow。

2、提取BGR分量

"""
#使用直接訪問的方法
B = img[:, :, 0]
G = img[:, :, 1]
R = img[:, :, 2]
"""
#使用split函數分解BGR
(B, G, R) = cv2.split(img) #分離圖像的RBG分量

提取BGR的分量的方法有兩種:

一種是通過直接訪問的方法,使用B = img[:, :, 0]

一種是通過cv2.split(img) 函數,

函數原型爲:void split(const Mat& src,Mat *mvBegin);

第一個參數爲要進行分離的圖像矩陣,第二個參數可以是Mat數組的首地址,或者一個vector對象

3、顯示圖片的BGR分量

#以灰度圖的形式顯示每個顏色的分量
"""
cv2.namedWindow("B",2)   #創建一個窗口
cv2.imshow('B', B)       #顯示B分量
cv2.namedWindow("G",2)   #創建一個窗口
cv2.imshow('G', G)       #顯示G分量
cv2.namedWindow("R",2)   #創建一個窗口
cv2.imshow('R', R)       #顯示R分量
"""

如圖所示,將BGR顏色分量提取後,如果直接顯示,顯示的結果將會是以該顏色的灰度圖,例如綠色分量,原圖片越綠,灰度圖就越亮。
輸入圖片說明

#以單通道顯示BGR分量圖片
# 生成一個值爲0的單通道數組
zeros = np.zeros(img.shape[:2], dtype = "uint8")
# 分別擴展B、G、R成爲三通道。另外兩個通道用上面的值爲0的數組填充
cv2.namedWindow("Blue",2)   #創建一個窗口
cv2.imshow("Blue", cv2.merge([B, zeros, zeros]))
cv2.namedWindow("Green",2)   #創建一個窗口
cv2.imshow("Green", cv2.merge([zeros, G, zeros]))
cv2.namedWindow("Red",2)   #創建一個窗口
cv2.imshow("Red", cv2.merge([zeros, zeros, R]))

如圖所示,將各顏色分量進行顯示,下面的圖像是三通道圖像,只是在cv2.split分離出的圖像基礎上,擴展另外兩個通道,但另外兩個通道值爲0,而得到下面的這樣的圖像。
輸入圖片說明

4、灰度圖顯示

#使用cvtColor轉換爲灰度圖
out_img_GRAY=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#將圖片轉換爲灰度圖
cv2.namedWindow("GRAY_imag",2)   #創建一個窗口
cv2.imshow('GRAY_imag', out_img_GRAY) #顯示灰度圖

輸入圖片說明

5、提取HSV分量並顯示每個分量

#使用cvtColor轉換爲HSV圖
out_img_HSV=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#將圖片轉換爲灰度圖
hsvChannels=cv2.split(out_img_HSV)  #將HSV格式的圖片分解爲3個通道

cv2.namedWindow("Hue",2)   #創建一個窗口
cv2.imshow('Hue',hsvChannels[0]) #顯示Hue分量
cv2.namedWindow("Saturation",2)   #創建一個窗口
cv2.imshow('Saturation',hsvChannels[1]) #顯示Saturation分量
cv2.namedWindow("Value",2)   #創建一個窗口
cv2.imshow('Value',hsvChannels[2]) #顯示Value分量

輸入圖片說明

最主要的函數
cv2.cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );

參數解釋:
. InputArray src: 輸入圖像即要進行顏色空間變換的原圖像,可以是Mat類
. OutputArray dst: 輸出圖像即進行顏色空間變換後存儲圖像,也可以Mat類
. int code: 轉換的代碼或標識,即在此確定將什麼制式的圖片轉換成什麼制式的圖片,如下圖
. int dstCn = 0: 目標圖像通道數,如果取值爲0,則由src和code決定
輸入圖片說明
碼雲下載完整代碼:項目完整代碼點這裏哦!

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