python学opencv|读取图像(十二)BGR图像转HSV图像

发布于:2024-12-18 ⋅ 阅读:(102) ⋅ 点赞:(0)

【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图的互相转化。


网站公告

今日签到

点亮在社区的每一天
去签到