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

2023-11-08

☞ ░ 前往老猿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空间的给照片换底的实现思路及程序示例,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 微信公号发消息咨询。
在这里插入图片描述

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python, 跟老猿学Python!

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于HSV颜色空间用OpenCV-Python给照片换底 的相关文章

  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • CVE-2023-3836:大华智慧园区综合管理平台任意文件上传漏洞复现

    文章目录 CVE 2023 3836 大华智慧园区综合管理平台任意文件上传漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 CVE 2023
  • Java学习----习题总结

    今日习题总结如下 TCP IP分层协议栈 TCP IP协议栈参考模型分为五个层次 应用层 传输层 网络层 链路层和物理层 应用层 是网络应用程序及其应用层协议存留的层次 该层包括了所有与网络相关的高层协议 如文件传输协议 FTP 超文本传输
  • 树莓派上开热点(AP)的三种办法实践结果V2

    树莓派上开热点 AP 的三种办法实践结果 date 2021 08 02 lastmod 2021 09 19 背景 UC2 项目中树莓派大脑和子模块有两种方式连接方式 一种是采用 I2C 总线通过 Arduino 做主从 一种是走 WIF
  • Spring(二)IoC 容器

    IoC 容器 Spring 容器是 Spring 框架的核心 容器将创建对象 把它们连接在一起 配置它们 并管理他们的整个生命周期从创建到销毁 Spring 容器使用依赖注入 DI 来管理组成一个应用程序的组件 这些对象被称为 Spring
  • Arcesium面试体验

    回合 1 能力和技术回合 第一轮有20个Aptitude MCQ 20分钟 和15个技术MCQ 15分钟 分别带有 1和 0 25标记方案 MCQ涵盖了所包含的主题 DSA 操作系统 C C Java基础知识 此后 有2个编码问题 45分钟
  • FFT(快速傅里叶变换)算法

    文章目录 功能 一次FFT的功能 一次IFFT的功能 总体功能 前置技能 多项式的阶 多项式的系数表达式 多项式的点值表达式 复数 复数的基本单位 复数的运算 复平面 复根 定义 几个性质 求多项式乘积的基本步骤 FFT 递归版FFT 核心
  • 【经验分享】Hydra(爆破神器)使用方法

    这个也是backtrack下面很受欢迎的一个工具 参数详解 R 根据上一次进度继续破解 S 使用SSL协议连接 s 指定端口 l 指定用户名 L 指定用户名字典 文件 p 指定密码破解 P 指定密码字典 文件 e 空密码探测和指定用户密码探
  • 大数据Hadoop完全分布式及心得体会

    文章目录 前言 认识hadoop 根据所学知识完成作业 并总结本学期心得体会 一 认识hadoop 二 一课一得作业讲解 实现步骤 1 搭建集群 2 模拟生成新能源车辆数据编写一个程序 3 最终部署 将这些数据写到HDFS中 三 学习收获
  • 概率论中 PDF,PMF,CDF的含义

    概率论中 PDF PMF CDF的含义 在概率论中 我们经常能碰到这样几个概念PDF PMF CDF 这里就简单介绍一下 PDF 概率密度函数 probability density function 在数学中 连续型随机变量的概率密度函数
  • vue的el-form-item标签的label展示名称左右对齐

    vue的el form item是下面的样子
  • 报错Failed to load resource: net::ERR_FILE_NOT_FOUND--浏览器设置跨域

    浏览器报错Failed to load resource net ERR FILE NOT FOUND代表此应用运行需要做跨域 推荐使用火狐浏览器做跨域 之后也用火狐访问 在地址栏输入 about config 点击接受风险并继续 输入se
  • xxl-rpc remoting error(connect timed out), for url : http://172.26.112.1:9999/run

    查看你部署的xxl job admin程序是否部署在外网的 如果是在外网 外网访问不到本地局域网主机 可以使用内网穿透 然后在执行器那里不使用自动获取地址 手动把穿透的地址填进去
  • 1477. 找两个和为目标值且不重叠的子数组

    1477 找两个和为目标值且不重叠的子数组 题目描述 样例1 样例2 样例3 样例4 示例 5 提示 解题思路 代码实现 题目描述 给你一个整数数组 arr 和一个整数值 target 请你在 arr 中找 两个互不重叠的子数组 且它们的和
  • 智慧疫情防控平台(图形化编程mind+)

    本文系湛江市第十七中学星火创客团队及岭南师范学院物联网俱乐部原创部分参赛项目 转载请保留声明 前言 本文章将教会大家如何使用图形化编程制作简易的智慧疫情防控平台 这个项目非常适合于低年级的学生去实践 锻炼自己的逻辑思维和积累一定的项目开发经
  • 嘉兴市人才网即时招聘栏目Ajax动态翻页爬虫练习

    声明 代码仅供技术学习交流 不作其他用途 即时招聘 https www jxrsrc com Index MoreInfo aspx TypeID 34 打开页面后拉到底下点下一页翻页发现浏览器中的地址没有发生变化 分析后这个网站是用ASP
  • 区块链技术在食品供应链领域的应用

    现如今 食品供应链的复杂程度变得越来越高 由此对于食品生产者 供应商和零售店 很难确保整个供应链上产品的真实性 食品安全的问题包含跨供应链认证和食品问题的普及 都是因为缺乏数据和可追踪性 导致事情更加不好 如果需要查询真正的原因 现在则需要
  • MyBatis映射关系

    目录 数据库的配置 一 映射关系一对一 1 映射关系 1 对 1 基本介绍 2 映射关系 1 对 1 映射方式 3 应用实例 3 1方式一 方式二 重点解析 注解的方式实现 注意事项和细节 二 映射关系多对一 1 基本介绍 2 注意细节 3
  • APAC 2013 部分题解

    目录 A The Alphabet Sticker C Increasing Shortest Path D Cup of Cowards E Balloons Colors F NASSA s Robot G The Stones Gam
  • 计算机视觉与深度学习-卷积神经网络-纹理表示&卷积神经网络-卷积神经网络-[北邮鲁鹏]

    这里写目录标题 参考文章 全连接神经网络 全连接神经网络的瓶颈 全连接神经网络应用场景 卷积神经网络 卷积层 CONV 卷积核 卷积操作 卷积层设计 卷积步长 stride 边界填充 特征响应图组尺寸计算 激活层 池化层 POOL 池化操作
  • 基于HSV颜色空间用OpenCV-Python给照片换底

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在 基于RGB颜色空间用OpenCV Python给蓝底照片换底 链接地址 https blog csdn net LaoYuanP