☞ ░ 前往老猿Python博文目录 /LaoYuanPython ░
一、引言
在《基于RGB颜色空间用OpenCV-Python给蓝底照片换底》(链接地址:/LaoYuanPython/article/details/120357065)介绍了在BGR颜色空间对蓝底照片换底的实现思路及具体代码,完成相关工作后老猿在CSDN找了下类似文章,看到了CSDN总裁余博主大大的文章《python+opencv代码给证件照换底色(别再用PS啦)》,这篇文章介绍了基于HSV空间给照片换底的思路和代码,让我想起好几月前学的知识,如是对上文的代码进行了基于HSV的快速改造。
HSV颜色空间对颜色的表述非常符合人眼识别颜色的情况,表达起来更加直观,其中H表示色彩、S表示饱和度、V表示明度,分别代表了人眼对颜色的感知,因此色彩的判断只要判断H通道的值即可,且有现成的表可以查颜色的HSV范围取值,因此比RGB识别色彩更方便。具体相关内容请参考《OpenCV-Python图像处理:用inRange刷选图像中指定颜色对象案例 /LaoYuanPython/article/details/111598414》的介绍。
本文就介绍结合老猿的思路和总裁余的思路来介绍基于HSV空间来实现照片颜色换底。
二、实现思路介绍
本文的实现思路如下:
将照片转换到HSV空间;按照蓝色的H值、S值和V值来设定照片底色的HSV三通道的范围,用此来调用inRange函数得到蓝底的掩膜背景图像;对掩膜背景图像进行膨胀处理(总裁余博主用的是闭运算,即先膨胀再腐蚀,应该更合理)得到参与运算的最终背景色掩膜,并求反后得到前景色掩膜。关于腐蚀膨胀和开闭运算请参考老猿OpenCV-Python相关专栏的介绍,具体请见博文后面;用背景色掩膜作为纯白色图片自与运算的掩膜得到白色背景,用前景色掩膜作为源图像自与运算的掩膜得到前景;将上面运算后的白色背景与前景想或得到最终结果。
上述思路与总裁余博主的思路主要区别在于用掩膜来获取图像的前景和背景,而总裁余博主的思路是判断背景色掩膜为255的值,将源图像对应位置像素的值直接换成要换底色的像素值。
另外,关于HSV空间蓝色的识别处理时,蓝色的H值用的是查表的100-124,但S和V值的最小值都大于蓝色查表的值,因为蓝底的照片的蓝色相对来说色彩的饱和度和明度都比较大一点,识别更精确。
三、实现代码
import cv2import numpy as npfrom opencvPublic import readImgFiledef changePhotoBGInHSV(fileName,minHSV,maxHSV,MorphOpCount=0):photo = readImgFile(fileName) #读入图像bgWhite = np.full(photo.shape[:],255,dtype=np.uint8) #构造一个与图像大小完全相同的全白图像#转换成HSV空间然后按蓝色范围进行蓝色像素的掩膜构造imgHSV = cv2.cvtColor(photo,cv2.COLOR_BGR2HSV)maskbgr = cv2.inRange(imgHSV, minHSV,maxHSV)#由于在边界位置可能存在像素值情况可能与其他背景色不同的情况,因此可能需要进行背景掩膜的扩展膨胀(MORPH_DILATE)处理,且迭代次数可能也有不同,视具体图像而定if MorphOpCount:#背景色掩膜进行扩张处理kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))maskbgr = cv2.morphologyEx(maskbgr, cv2.MORPH_DILATE , kernal, iterations=MorphOpCount)#获得背景掩膜的反图像得到前景掩膜maskbgrInv = cv2.bitwise_not(maskbgr)#获取背景掩膜对应的白色背景对应图像bgWhite = cv2.bitwise_and(bgWhite, bgWhite, mask=maskbgr)#将输入图像应用前景掩膜,得到输入图像的前景,并将该前景与掩膜处理后的白色背景相叠加获得最后处理图像photoFront = cv2.bitwise_and(photo,photo,mask=maskbgrInv)result = cv2.bitwise_or(photoFront,bgWhite)#显示处理图像并设置鼠标回调函数,当出现未完全处理好的噪点时,通过鼠标获得该噪点位置的像素值,以调整前面的阈值处理的阈值cv2.imshow('pic',result)cv2.waitKey(0)changePhotoBGInHSV(r'f:\pic\girl.jpg',np.array([100, 60, 70]),np.array([124, 255, 255]),1)
本文使用的自定义公用模块函数readImgFile,其功能请参考《/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》中的介绍。
四、执行结果
经上述处理后的结果照片如下(相关照片来源于网络,如涉及侵权请博客留言处理):
):
五、小结
本文介绍了基于HSV空间的给照片换底的实现思路及程序示例,HSV由于对颜色的识别更准确,因此得到的图像效果比RGB颜色空间更好。同时HSV的蓝色的H值非常精确,因此不需要象BGR空间一样需要结合照片去确认BGR三通道的范围,因此上述代码对于所有蓝底照片都适用。
更多图像处理的内容请参考专栏《OpenCV-Python图形图像处理 /laoyuanpython/category_9979286.html》、《/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。
如对文章内容存在疑问,可在博客评论区留言,或关注老猿Python微信公号发消息咨询。
关于老猿的付费专栏
付费专栏《/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 /LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;付费专栏《/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;付费专栏《/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》付费专栏《/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。