当前位置: 首页 > news >正文

opencv进阶 ——(七)图像处理之寸照换背景

        寸照换背景,通常指的是将个人证件照片的背景色更换为另一种颜色,如白色、蓝色或红色等,以满足不同用途的要求。例如,护照照片通常要求白色背景,而身份证照片可能需要蓝色背景。这个过程通常涉及到图像处理技术,尤其是图像分割和合成技术。以下是一个简单的介绍:

步骤

  1. 图像预处理

    • 首先,对原始图像进行去噪和平滑处理,以便后续的背景分割更加准确。
  2. 背景分割

    • 使用图像分割算法,如阈值分割、边缘检测、色彩空间转换(如从RGB到HSV)或机器学习方法(如深度学习的语义分割模型),来识别并分离出前景(人像)和背景。
  3. 前景提取

    • 一旦背景被分割出来,通常会使用掩模来标记和提取前景,保留人像部分。
  4. 背景替换

    • 创建一个新的背景图像,通常是纯色背景,如白色、蓝色或红色。然后,将提取的前景(人像)放置在这个新背景上。
  5. 融合与调整

    • 为了使前景与新背景融合得更好,可能需要进行边缘平滑处理,例如羽化或模糊,以消除硬边缘。同时,可能需要调整前景的亮度、对比度和色彩,使其与新背景协调一致。
  6. 输出图像

    • 最后,将处理后的图像保存为所需的格式和分辨率。

背景分割

边缘检测

一般来说,寸照是纯色背景,存在比较明显的边界,所以,首先我们尝试通过边缘检测来分离背景色和人像。

虽然存在比较明显的边界,但边缘检测无法找出完整的闭环团,因此无法得到人像区域。

二阶导数法

纯色背景颜色一致,进行二阶求导,数值为零,人脸区域由于存在颜色变换,因此会有数据,由此可以得到人脸部分的大致区域。

自适应二值法

基于背景颜色均值法分离背景

        在得到人像区域后,可以通过一下步骤分离背景,更改颜色然后合并成新的图像

1、获取背景区域

2、转换到HSV颜色系统,计算背景区域颜色均值

3、获取给行阈值内,均值颜色接近的区域

4、修改背景颜色区域的颜色

5、增加滤波降低边缘色差

上图可以看出,存在比较明显的红色边界,即便是加了滤波也还比较明显。

基于grabCut函数分割人像

  grabCut 函数是OpenCV库中用于图像分割的一个算法,它结合了交互式和自动分割的方法。grabCut基于图形割(Graph Cut)算法,用于从复杂背景中提取前景对象。这个算法特别适合于需要用户参与的场景,用户可以通过指定一些初始的像素标记(如前景、背景或不确定区域)来指导算法进行分割。

  grabCut函数的主要优点是它能够迭代地优化分割结果,即使初始的用户标记不是很精确,也能逐渐改进分割质量。

图像放大后,依然可以看出比较明显的边界

相关文章:

  • 基于python flask的旅游数据大屏实现,有爬虫有数据库
  • 算法的时间与空间复杂度
  • 【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr
  • 【busybox记录】【shell指令】readlink
  • Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。
  • 基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸
  • 【前端每日基础】day27——小程序开发
  • 居间人从事光伏行业需要了解的关键因素
  • STM32实验之USART串口发送+接受数据(二进制/HEX/文本)
  • Putty: 随心御剑——远程启动服务工具plink
  • 【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)
  • jenkins插件之Warnings
  • 稳住!一招制胜:打造JavaScript防抖函数的终极指南【含代码示例】
  • Spring6基础笔记
  • css卡片翻转 父元素翻转子元素不翻转效果
  • [译] React v16.8: 含有Hooks的版本
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • android图片蒙层
  • Hibernate最全面试题
  • JS数组方法汇总
  • Protobuf3语言指南
  • Redis中的lru算法实现
  • Transformer-XL: Unleashing the Potential of Attention Models
  • ViewService——一种保证客户端与服务端同步的方法
  • webpack4 一点通
  • 跨域
  • 聊聊sentinel的DegradeSlot
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 延迟脚本的方式
  • 一道闭包题引发的思考
  • 硬币翻转问题,区间操作
  • 正则表达式
  • 走向全栈之MongoDB的使用
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • "无招胜有招"nbsp;史上最全的互…
  • #define与typedef区别
  • #ifdef 的技巧用法
  • #pragma pack(1)
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (未解决)macOS matplotlib 中文是方框
  • (循环依赖问题)学习spring的第九天
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .apk文件,IIS不支持下载解决
  • .NET 8.0 中有哪些新的变化?
  • .NET CORE Aws S3 使用
  • .NET MVC之AOP
  • .NET 反射的使用
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • //TODO 注释的作用
  • /boot 内存空间不够
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码