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颜色分量提取后,如果直接显示,显示的结果将会是以该颜色的灰度图,例如绿色分量,原图片越绿,灰度图就越亮。
OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序_第1张图片

#以单通道显示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,而得到下面的这样的图像。
OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序_第2张图片

4、灰度图显示

#使用cvtColor转换为灰度图
out_img_GRAY=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图片转换为灰度图
cv2.namedWindow("GRAY_imag",2)   #创建一个窗口
cv2.imshow('GRAY_imag', out_img_GRAY) #显示灰度图

OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序_第3张图片

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分量

OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序_第4张图片

最主要的函数
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决定
OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序_第5张图片
码云下载完整代码:项目完整代码点这里哦!

你可能感兴趣的:(机器学习&计算机视觉)