【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格式比转换后的对比,发现新图比原图质量更高。