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) #等待用户操作
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.imshow(‘窗口标题’, image),如果前面没有cv2.namedWindow,就自动先执行一个cv2.namedWindow。
"""
#使用直接访问的方法
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对象
#以灰度图的形式显示每个颜色的分量
"""
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,而得到下面的这样的图像。
#使用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.cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,如下图
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
码云下载完整代码:项目完整代码点这里哦!