【1】引言
前述已经学习了opencv中图像BGR相关知识,文章链接包括且不限于下述:
python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客
python学opencv|读取图像(七)抓取像素数据顺利修改图像大小-CSDN博客
python学opencv|读取图像(九)用numpy创建黑白相间灰度图-CSDN博客
python学opencv|读取图像(十)用numpy创建彩色图像-CSDN博客
python学opencv|读取图像(十一)彩色图像转灰度图的两种办法-CSDN博客
在这里,我们了解奥,BGR是每个像素点上的颜色构成。
对于灰度图,只有一个通道,获取BGR值只会得到一个数据;对于彩色图,由三个通道,获取BGR值将会得到三个数据。
但对于图像的表达,还有一种控制颜色的方式是调整图像的色调(Hue)、饱和度(Saturation)和亮度(Value)。色调、饱和度和亮度合起来简称为HSV。
关于色调、饱和度和亮度的百度百科解释链接为:HSV颜色模型_百度百科。
【2】官网教程
在opencv的官网,提供了BGR和HSV的互相转化说明,链接如下:
OpenCV: Color conversions
官网提供的转化公式没有详细的来源,但如果只进行应用的话,即使不是很能读懂官网文档也不影响对代码的使用。所以,我们直接大胆尝试。
【3】BGR转HSV图
我们按照已经熟悉的方式,先引入模块,然后读图片、之后调整和显示图片,最后保存图片的工作流程,在pycharm等编辑器中输入下述代码:
import cv2 as cv #引入cv2模块
import numpy as np
image=cv.imread("cv-BGR.png") #读取图片,将其转化为灰度图
if image is not None: #成功读取图片
cv.imshow('cvtest', image) # 显示为彩色图
hsv_image=cv.cvtColor(image,cv.COLOR_BGR2HSV) #BGR和HSV转化
image_h=np.hstack((image,hsv_image)) #BGR和HSV图像拼接
cv.imshow('hcvtest', image_h) # 显示为拼接图
cv.imwrite('opencv-HSV-001.jpg', hsv_image) #保存HSV图
cv.waitKey() # 图片显示时间
cv.destroyAllWindows() # 释放所有窗口
else: #未找到图片
print("Error: 图片无法加载")
在这里,我们会发现和之前不同的主要是中间代码段:
hsv_image=cv.cvtColor(image,cv.COLOR_BGR2HSV) #BGR和HSV转化
image_h=np.hstack((image,hsv_image)) #BGR和HSV图像拼接
cv.imshow('hcvtest', image_h) # 显示为拼接图
cv.imwrite('opencv-HSV-001.jpg', hsv_image) #保存HSV图
这里首先调用cvtColor()函数,让BGR图和HSV图进行了转化;
然后使用了np.hstack()函数,将BGR图和HSV图横向拼接在了一起;
之后就比较简单,显示拼接图和保存HSV图。
代码使用的原图为:
图1 BGR图
代码运行后,获得的拼接图像为:
图2(左BGR,右HSV)
显然,在直接转化的条件下,HSV图像可能会失真。
【4】HSV转BGR图
将代码稍加修改,在cvtColor()函数中,将cv.COLOR_BGR2HSV更新为cv.COLOR_HSV2BGR,实现HSV图转BGR图。
使用之前获得的HSV图作为原图:
图3 HSV图
运行代码后,获得的图像为:
图4 (左HSV,右BGR)
显然HSV转回BGR发生了新的失真情况。
为追溯,把第3章中的HSV图保存为png形式:
图5 HSV图png格式
然后再度将HSV图转化为BGR:
图6 (左HSV,右BGR)-原图png格式
由图6可见,使用png格式作为原图,HSV转BGR看起来会好一些。
【5】总结
探索了python+opencv实现BGR图和HSV图的互相转化。