【1】引言
前序学习进程中,我们已经掌握了对HSV通道和BGR通道的拆分和合并,并通过自由组合的形式,获得了和初始图像完全不一样的新图像,相关文章可以参考下述链接:
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分-CSDN博客
python学opencv|读取图像(十五)BGR图像和HSV图像通道合并-CSDN博客
在此基础上,我们掌握了如何抓取各个通道的具体值,自然地,我们会想到修改各个通道的具体值。
在更早的时候,其实我们已经掌握了如何修改BGR图像各个通道的值,并获得了灰度和彩色图像,相关链接包括且不限于下述:
python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客
python学opencv|读取图像(八)用numpy创建纯黑灰度图-CSDN博客
python学opencv|读取图像(十)用numpy创建彩色图像-CSDN博客
【2】代码测试
在前述基础上,我们本次课程直接对HSV图像进行通道设定。
【2.1】BGR转HSV
第一步,将BGR图像转化为HSV图像,在pycharm等编辑器中输入以下代码:
import cv2 as cv # 引入CV模块
import numpy as np # 引入numpy模块
bgr_image = cv.imread('cv-ini-000.png')
if bgr_image is not None:
cv.imshow('cv-ini-000', bgr_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save.png', bgr_image) # 保存图片
# BGR转HSV
hsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV) # BGR转HSV
cv.imshow('cv-ini-000-hsv', hsv_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save-hsv.png', hsv_image) # 保存图片
cv.waitKey() # 不会自动关闭图像
cv.destroyAllWindows() # 释放所有窗口
else:
print("There is no any photo")
使用的cv-ini-000.bng图像为:
图1 cv-ini-000.bng
转换后的HSV图像为:
图2 cv-ini-000-save-hsv.png
【2.2】HSV通道拆分
在获得HSV图像基础上,对HSV的通道进行拆分。
在pycharm等编辑器中补充下述代码:
h,s,v=cv.split(hsv_image) #HSV拆分
cv.imshow('H', h) # 显示H通道
cv.imwrite('cv-ini-000-save-hsv-h.png', h) # 保存图片
这部分代码的意思是,先将BGR图转化的HSV图拆分为HSV三个通道,然后把H通道图像输出在屏幕上:
图3 cv-ini-000-save-hsv-h.png
然后把H通道数值强行转化为160。在此之前,我们梳理一下HSV的取值范围:
色调H:光的颜色,取值范围[0,180];
饱和度S:色彩的深浅,取值范围[0,255];
亮度V:光的明暗,取值范围[0,255]。
然后我们继续输入下述代码:
h[:,:]=160 #强制H通道取值=160
cv.imshow('H=160', h) # 显示H通道
cv.imwrite('cv-ini-000-save-hsv-h=160.png', h) # 保存图片
运行后,获得的cv-ini-000-save-hsv-h=160.png图像为:
图4 cv-ini-000-save-hsv-h=160.png
因为是单通道图像,所以是纯色,这个图像是符合预期的。
【2.3】HSV通道合并
然后我们再把通道合并,看看效果,继续输入下述代码:
h160svm_image=cv.merge([h,s,v]) #合并HSV通道
cv.imshow('H=160SV', h160svm_image) # 显示合并图像
cv.imwrite('cv-ini-000-save-hsv-h=160sv.png', h160svm_image) # 保存图片
运行后的图像为:
图5 cv-ini-000-save-hsv-h=160sv.png
图5和图2不同,根本原因就在于图5中的H=180。
出于好奇,我们读取一下特定点的HSV值,来对比图5和图2的这种不同。继续补充下述代码:
print('hsv_image[100,100]=',hsv_image[100,100]) #读取原hsv_image图像的HSV值
print('h160svm_image[100,100]=',h160svm_image[100,100]) #读取H=160后的h160sv_image图像的HSV值
print('hsv_image[600,800]=', hsv_image[600, 800]) # 读取原hsv_image图像的HSV值
print('h160svm_image[600,800]=', h160svm_image[600, 800]) # 读取H=160后的h160sv_image图像的HSV值
运行后的输出为:
图6 HSV值读取
由图6可见,确实是H通道的值在约束H值以后,每一个像素点都有H=160。
设置SV通道值得方法类似,不再赘述。
至此的完整代码为:
import cv2 as cv # 引入CV模块
import numpy as np # 引入numpy模块
bgr_image = cv.imread('cv-ini-000.png')
if bgr_image is not None:
cv.imshow('cv-ini-000', bgr_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save.png', bgr_image) # 保存图片
# BGR转HSV
hsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV) # BGR转HSV
cv.imshow('cv-ini-000-hsv', hsv_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save-hsv.png', hsv_image) # 保存图片
h,s,v=cv.split(hsv_image) #HSV拆分
cv.imshow('H', h) # 显示H通道
cv.imwrite('cv-ini-000-save-hsv-h.png', h) # 保存图片
h[:,:]=160 #强制H通道取值=160
cv.imshow('H=160', h) # 显示H通道
cv.imwrite('cv-ini-000-save-hsv-h=160.png', h) # 保存图片
h160svm_image=cv.merge([h,s,v]) #合并HSV通道
cv.imshow('H=160SV', h160svm_image) # 显示合并图像
cv.imwrite('cv-ini-000-save-hsv-h=160sv.png', h160svm_image) # 保存图片
print('hsv_image[100,100]=',hsv_image[100,100]) #读取原hsv_image图像的HSV值
print('h160svm_image[100,100]=',h160svm_image[100,100]) #读取H=160后的h160sv_image图像的HSV值
print('hsv_image[600,800]=', hsv_image[600, 800]) # 读取原hsv_image图像的HSV值
print('h160svm_image[600,800]=', h160svm_image[600, 800]) # 读取H=160后的h160sv_image图像的HSV值
cv.waitKey() # 不会自动关闭图像
cv.destroyAllWindows() # 释放所有窗口
else:
print("There is no any photo")
【3】总结
掌握了设置HSV图像HSV值的技巧。