资讯专栏INFORMATION COLUMN

基于HSV颜色空间用OpenCV-Python给照片换底

toddmark / 3688人阅读

摘要:本文就介绍结合老猿的思路和总裁余的思路来介绍基于空间来实现照片颜色换底。老猿,跟老猿学前往老猿博文目录

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython

一、引言

在《基于RGB颜色空间用OpenCV-Python给蓝底照片换底》(链接地址:https://blog.csdn.net/LaoYuanPython/article/details/120357065)介绍了在BGR颜色空间对蓝底照片换底的实现思路及具体代码,完成相关工作后老猿在CSDN找了下类似文章,看到了CSDN总裁余博主大大的文章《python+opencv代码给证件照换底色(别再用PS啦)》,这篇文章介绍了基于HSV空间给照片换底的思路和代码,让我想起好几月前学的知识,如是对上文的代码进行了基于HSV的快速改造。

HSV颜色空间对颜色的表述非常符合人眼识别颜色的情况,表达起来更加直观,其中H表示色彩、S表示饱和度、V表示明度,分别代表了人眼对颜色的感知,因此色彩的判断只要判断H通道的值即可,且有现成的表可以查颜色的HSV范围取值,因此比RGB识别色彩更方便。具体相关内容请参考《OpenCV-Python图像处理:用inRange刷选图像中指定颜色对象案例 https://blog.csdn.net/LaoYuanPython/article/details/111598414》的介绍。

本文就介绍结合老猿的思路和总裁余的思路来介绍基于HSV空间来实现照片颜色换底。

二、实现思路介绍

本文的实现思路如下:

  1. 将照片转换到HSV空间;
  2. 按照蓝色的H值、S值和V值来设定照片底色的HSV三通道的范围,用此来调用inRange函数得到蓝底的掩膜背景图像;
  3. 对掩膜背景图像进行膨胀处理(总裁余博主用的是闭运算,即先膨胀再腐蚀,应该更合理)得到参与运算的最终背景色掩膜,并求反后得到前景色掩膜。关于腐蚀膨胀和开闭运算请参考老猿OpenCV-Python相关专栏的介绍,具体请见博文后面;
  4. 用背景色掩膜作为纯白色图片自与运算的掩膜得到白色背景,用前景色掩膜作为源图像自与运算的掩膜得到前景;
  5. 将上面运算后的白色背景与前景想或得到最终结果。

上述思路与总裁余博主的思路主要区别在于用掩膜来获取图像的前景和背景,而总裁余博主的思路是判断背景色掩膜为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,其功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》中的介绍。

四、执行结果

经上述处理后的结果照片如下(相关照片来源于网络,如涉及侵权请博客留言处理):
):

五、小结

本文介绍了基于HSV空间的给照片换底的实现思路及程序示例,HSV由于对颜色的识别更准确,因此得到的图像效果比RGB颜色空间更好。同时HSV的蓝色的H值非常精确,因此不需要象BGR空间一样需要结合照片去确认BGR三通道的范围,因此上述代码对于所有蓝底照片都适用。

更多图像处理的内容请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。

如对文章内容存在疑问,可在博客评论区留言,或关注博客左边的:老猿Python 微信公号发消息咨询。

老猿Python, 跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121821.html

相关文章

  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • Python照片换底色,基于opencv模块

    摘要:现在网上出现了很多在线换底色的网页版工具是这么做的呢其实用就可以实现。 现在网上出现了很多在线换底色的网页版工具是这么做的呢?其实用Python就可以实现。 环境要求 Python3 numpy函数库 opencv库 安装 下载适应版本的numpy函数库,我电脑是WIN10 64位,安装的函数库是numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl 下载适...

    saucxs 评论0 收藏0
  • opencv python 2D直方图

    Histograms - 3 : 2D Histograms 我们已经计算并绘制了一维直方图,因为我们只考虑一个特征,即像素的灰度强度值.但在二维直方图中,需要考虑两个特征,通常,它用于查找颜色直方图,其中两个要素是每个像素的色调和饱和度值. OpenCV中的2D直方图 使用函数cv.calcHist(), 对于颜色直方图,我们需要将图像从BGR转换为HSV。 (请记住,对于1D直方图,我们从B...

    BlackFlagBin 评论0 收藏0
  • 使python通过基于颜色的图像分割进行目标检测

    摘要:我是一名计算机工程专业的学生,我正在开展一个名为机器学习的项目,用于智能肿瘤检测和识别。在该项目中使用基于颜色的图像分割来帮助计算机学习如何检测肿瘤。使用python通过基于颜色的图像分割进行目标检测 照片来自Pexels的rawpixel.com 入门 如果您已经安装了jupyter notebook或IDE,您可以运行python和OpenCV,只需跳到执行即可。 工...

    tylin 评论0 收藏0
  • 使python通过基于颜色的图像分割进行目标检测

    摘要:我是一名计算机工程专业的学生,我正在开展一个名为机器学习的项目,用于智能肿瘤检测和识别。在该项目中使用基于颜色的图像分割来帮助计算机学习如何检测肿瘤。使用python通过基于颜色的图像分割进行目标检测 照片来自Pexels的rawpixel.com 入门 如果您已经安装了jupyter notebook或IDE,您可以运行python和OpenCV,只需跳到执行即可。 工...

    justjavac 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<