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決定
碼雲下載完整代碼:項目完整代碼點這裏哦!