python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入

发布于:2024-12-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

【1】引言

前序学习过程中,我们偶然发现:如果原始图像是png格式,将其从BGR转向HSV,再从HSV转回BGR后,图像的效果要好于JPG格式。

文章链接为:

python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客

但之前“BGR转向HSV,再从HSV转回BGR”的过程分别写了两个程序。

在此实践基础上,我们尝试在同一个程序内部实现BGR-HSV-BGR的闭环转换。

【2】代码编写

在前述文章的基础上,我们在pycharm等编辑器输入下述代码:

import cv2 as cv  # 引入cv2模块
import numpy as np

image = cv.imread("cv-BGR-000.png")  # 读取图片
if image is not None:  # 成功读取图片
    cv.imshow('cvtest', image)  # 显示为彩色图

    # BGR向HSV转化
    hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV转化
    image_bh = np.hstack((image, hsv_image))  # BGR和HSV图像拼接
    cv.imshow('hcvtest', image_bh)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV图
    cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化
    bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV转化
    image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV图像拼接
    cv.imshow('bgrtest', image_hb)  # 显示为拼接图
    cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR图
    cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV图像拼接

    cv.waitKey()  # 图片显示时间
    cv.destroyAllWindows()  # 释放所有窗口
else:  # 未找到图片
    print("Error: 图片无法加载")

代码看起来很长,但实际上可以大致分为三个模块:

第一个模块引入cv2和numpy模块;

第二个模块包括两部分,第一部分实现BGR向HSV转换,第二部分实现HSV向BGR转换;

第三个模块释放所有对象。

【3】代码测试

运行代码前,我们准备的原始图像cv-BGR-000.png为:

图1 cv-BGR-000.png

运行代码后,获得的BGR转HSV图为cv-BGRTOHSV-001.png。

cv-BGRTOHSV-001.png和原cv-BGR-000.png对比效果为:

图2 cv-BGR-000.png和cv-BGRTOHSV-001.png对比

显然,在BGR转向HSV图像后,HSV图像似乎染上了很多红晕。

代码继续运行,获得的HSV转回的BGR图为cv-HSVTOBGR-001.png。

cv-HSVTOBGR-001.png和原cv-BGRTOHSV-001.png对比效果为:

图3 cv-BGRTOHSV-001和cv-HSVTOBGR-001.png对比

此时我们发现:由HSV转回BGR后的图像,似乎和原图完全一致。

【4】图像对比

为实现上述猜想,于是继续增添代码,将BGR-HSV-BGR的图像和原图进行对比:

# HSV向BGR转化后和原图对比
image_bhb = np.hstack((image, bgr_image))  # HSV转回BGR图像和原图拼接
cv.imshow('bgrhsvbgrtest', image_bhb)  # 显示为拼接图
cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR图

代码运行后的效果为:

图4 cv-BGRTOHSVTOBGR.png

由图4可见,基于png格式图像的BGR-HSV-BGR的闭环转换,图像几乎是无损的回到了原来的模样。

此时我们还会发现,转回的新图比原图还大:

图5 转回的新图比原图还大

上述发现有助于大家在实际工作生活中进行灵活转换图像。

此时的完整代码为:

import cv2 as cv  # 引入cv2模块
import numpy as np

image = cv.imread("cv-BGR-000.png")  # 读取图片
if image is not None:  # 成功读取图片
    cv.imshow('cvtest', image)  # 显示为彩色图

    # BGR向HSV转化
    hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV转化
    image_bh = np.hstack((image, hsv_image))  # BGR和HSV图像拼接
    cv.imshow('hcvtest', image_bh)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV图
    cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化
    bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV转化
    image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV图像拼接
    cv.imshow('bgrtest', image_hb)  # 显示为拼接图
    cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR图
    cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化后和原图对比
    image_bhb = np.hstack((image, bgr_image))  # HSV转回BGR图像和原图拼接
    cv.imshow('bgrhsvbgrtest', image_bhb)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR图

    cv.waitKey()  # 图片显示时间
    cv.destroyAllWindows()  # 释放所有窗口
else:  # 未找到图片
    print("Error: 图片无法加载")

 【5】总结

探索了png格式的图像,进行BGR-HSV-BGR格式比转换后的对比,发现新图比原图质量更高。