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

☞ ░ 前往老猿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 cv2
import numpy as np

from opencvPublic import readImgFile

def 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颜色空间用OpenCV-Python给照片换底_第1张图片

五、小结

本文介绍了基于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 ░

你可能感兴趣的