# OpenCV BGR分量显示程序 **Repository Path**: itkevin/OpenCV_BGR_show ## Basic Information - **Project Name**: OpenCV BGR分量显示程序 - **Description**: OpenCV BGR分量显示程序 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-03-02 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序 #### 介绍 OpenCV+Python 使用openCV中的split()函数和 cvtColor()函数提取一张彩色图片的BGR分量图、灰度图、HSV分量图 #### 软件架构 模块:OpenCV 4.0.0.21 编程语言:Python 3.7.2 编译器:PyCharm 2018 ### 先上一张效果图 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/214528_6aed7476_4837051.png "QQ截图20190228214513.png") 第一行 第1张图是原始图片,第2张图片是灰度图,第3张图是Hue色度分量图,第4张图是Saturation饱和度分量图,第5张图是Value亮度分量 第二行 第1张图是绿色分量灰度图,第2张图是红色分量灰度图,第3张图是蓝色分量灰度图。 ### 所有程序代码 ``` # -*- 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颜色分量提取后,如果直接显示,显示的结果将会是以该颜色的灰度图,例如绿色分量,原图片越绿,灰度图就越亮。 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/212921_22887f41_4837051.png "QQ截图20190228212903.png") ``` #以单通道显示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,而得到下面的这样的图像。 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/213353_b5f88411_4837051.png "QQ截图20190228213001.png") ### 4、灰度图显示 ``` #使用cvtColor转换为灰度图 out_img_GRAY=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图片转换为灰度图 cv2.namedWindow("GRAY_imag",2) #创建一个窗口 cv2.imshow('GRAY_imag', out_img_GRAY) #显示灰度图 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/213645_ae963a66_4837051.png "QQ截图20190228213631.png") ### 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分量 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/213655_529ab467_4837051.png "QQ截图20190228213625.png") 最主要的函数 `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决定 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0228/214252_d83a109e_4837051.png "QQ截图20190228214233.png")