OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色


目录

OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色

前言

蓝背景证件照替换白色

蓝背景证件照替换红色

总结

颜色空间

HSV颜色空间


前言

计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:

1、研究代码(慢,不稳定,独立并与其他库不兼容)
2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。

OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。

故而我们选择学习OpenCV,我们来一步步的学习OpenCV。


蓝背景证件照替换白色

如果你想使用Python的OpenCV替换证件照的蓝色背景,首先需要读取证件照图片,然后将其转换为HSV颜色空间。然后,你可以使用inRange函数定义蓝色范围并使用bitwise_and函数提取该颜色。接下来,你可以使用膨胀和腐蚀操作来填充蓝色区域。最后,使用cv2.imwrite函数保存新的证件照图片即可。

核心·蓝色色域

# 定义蓝色范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([140, 255, 255])

核心·白色色值

# 将背景替换为白色
img[erosion == 255] = [255, 255, 255]

代码

import cv2
import numpy as np# 读取证件照
img = cv2.imread('xiaoercun.jpg')
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义蓝色范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([140, 255, 255])
# 提取蓝色区域
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(img, img, mask=mask)
# 使用膨胀和腐蚀操作填充蓝色区域
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(mask, kernel, iterations=1)
erosion = cv2.erode(dilation, kernel, iterations=1)
# 将背景替换为白色
img[erosion == 255] = [255, 255, 255]
# 保存新的证件照
cv2.imwrite('newID.jpg', img)

实际效果:

蓝背景证件照替换红色

使用 OpenCV 和 Python,可以通过以下步骤实现替换证件照蓝背景为红背景:

  1. 读取证件照图像;
  2. 通过颜色识别和阈值处理,提取出蓝色背景区域;
  3. 将提取出的蓝色背景区域替换为红色背景;
  4. 将替换后的图像保存。

核心·红色色值

img[np.where(mask == 255)] = [0, 0, 255]

代码

import cv2
import numpy as np# 读取证件照
img = cv2.imread('xiaoercun.jpg')
cv2.imshow("blue", img)
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义蓝色范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([140, 255, 255])
# 提取蓝色区域
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(img, img, mask=mask)
# 使用膨胀和腐蚀操作填充蓝色区域
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(mask, kernel, iterations=1)
erosion = cv2.erode(dilation, kernel, iterations=1)
# 替换背景
img[np.where(mask == 255)] = [0, 0, 255]
# 保存新的证件照
cv2.imwrite('red.jpg', img)
cv2.imshow('red', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

我这里替换的都是纯色,当我们的照片不是纯色的时候就需要先进行抠图处理,这里还是需要复杂的AI计算的,我这里只是片面的进行了颜色色值的替换,只能当做教学用例啊。

颜色空间

人类眼睛通常能够检测出比数字设备可以重现的更多颜色。 例如,如果你看一张空白的白纸,你的眼睛可能检测到至少 100 个不同的白色阴影。 白色墙很容易有1500种白色色调。

高质量的数码相机、扫描仪和其他图像采集设备还可以检测数十万甚至数百万种颜色。 由于存在这么多可检测的颜色,成像专业人员发明了用于指定颜色的模型。 这些模型称为 颜色空间。

这些模型被称为颜色空间的原因是,其中大多数模型可以映射到二维、三维或四维坐标系,类似于笛卡尔坐标系。 因此,可以说颜色由二维、三维或四维空间中的坐标组成。 颜色空间中的颜色组件也称为 颜色通道。

某些颜色空间旨在独立于用于生成颜色图像的任何设备。 有些设备非常依赖。

HSV颜色空间

最后我对HSV这个颜色空间做个解释。

艺术家经常使用色调、饱和度和值 (HSV) 颜色空间 。 “Hue”是我们通常认为的颜色。 它是一种颜色的属性,我们为其命名,例如“红色”或“blue”。 “Value”是“光度”的另一个词,该颜色的属性使它似乎相当于黑白之间的一些灰色阴影。 饱和度是衡量颜色与相同 光度灰色的显示方式的度量值。 零饱和度表示没有色调,只是灰度。 HSV 颜色空间已规范化。

上图显示了 HSV 空间的折线图,其形式为十六进制。 其每个交叉部分都是一个六边形。 每个横段的顶点是红色、黄色、绿色、青色、蓝色和洋红。 HSV 空间中的颜色通过说明色调角度、色度级别和光度级别来指定。 零的色调角度为红色。 色调角度以逆时针方向增加。 互补颜色相距 180。

HSV 颜色空间可以是依赖设备,也可以是独立于设备的。

OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色相关推荐

  1. OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析

    OpenCV这么简单为啥不学--1.12.使用ssim函数对两张照片进行相似度分析 目录 OpenCV这么简单为啥不学--1.12.使用ssim函数对两张照片进行相似度分析 前言 ssim函数 图像相 ...

  2. OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题

    OpenCV这么简单为啥不学--1.5.解决putText中文乱码问题 目录 OpenCV这么简单为啥不学--1.5.解决putText中文乱码问题 前言 putText中文乱码问题 putText中 ...

  3. OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)

    OpenCV这么简单为啥不学--1.4.基础标识绘制(绘制线line函数.rectangle函数绘制四边形.circle函数绘制圆形.putText函数绘制文字.putText绘制中文文字) 目录 O ...

  4. OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度

    OpenCV这么简单为啥不学--1.10.addWeighted设置图片透明度 目录 OpenCV这么简单为啥不学--1.10.addWeighted设置图片透明度 前言 cv2.addWeighte ...

  5. OpenCV这么简单为啥不学——1.2、图片截取(数组截取)

    OpenCV这么简单为啥不学--1.2.图片截取(数组截取) 目录 OpenCV这么简单为啥不学--1.2.图片截取(数组截取) 前言 图片截取 总结 前言 计算机视觉市场巨大而且持续增长,且这方面没 ...

  6. OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理

    OpenCV这么简单为啥不学--1.13图片冷白皮(美白)处理 目录 OpenCV这么简单为啥不学--1.13图片冷白皮(美白)处理 前言 分析 核心代码 颜色美白前后对比·20个单位 颜色美白前后对 ...

  7. win7·64bit+VS2013+opencv的简单配置

    win7·64bit+VS2013+opencv的简单配置 win7x64 vs2013 opencv 如果你不需要: 在调试的时候看OpenCV的源代码: 添加新的功能支持,比如GPU. OpenC ...

  8. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了. 在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简 ...

  9. opencv学习—简单车牌识别操作(python)

    opencv学习-简单车牌识别操作(python) 目录 opencv学习-简单车牌识别操作(python) 利用opencv进行车牌识别的详细流程如下: 1.车牌检测 2.分割车牌号并进行识别 3. ...

最新文章

  1. hibernate连接池配置
  2. C++ 哪些函数不能声明成虚函数
  3. asterisk通话无声音_对讲机的语音通话间距到底有多远?对讲机的常见问题?
  4. AI大牛Jerry Kaplan:AGI?没有技术和工程基础
  5. Hibernate 查询
  6. Git从远程主分支切换出一个开发分支
  7. 河流干涸的原因可能是水循环被破坏
  8. 计算机如何做材料的应力应变曲线,常用材料应力应变曲线.xlsx
  9. Keil v5安装和使用
  10. MATLAB表示非线性系统,matlab非线性控制系统分析.ppt
  11. Linux设备驱动开发入门之——hello驱动
  12. 度度熊的午饭时光[2017百度之星资格赛 1004]
  13. 终于离职了,千万别在工作交接上翻车!
  14. CCF系列题解--2015年3月第三题 节日
  15. 7种工具帮助你审查代码
  16. @EnableScheduling和@Scheduled的使用
  17. 官方资料:Oracle 10g DBA 学习手册(精心整理,申请加精)
  18. Android开发日志打卡APP(一)
  19. 秋招笔试算法题——电容充电
  20. CMDB(运维自动化)

热门文章

  1. Linux下操纵CPU曲线绘制心形
  2. 图——图的存储结构(邻接矩阵和邻接表法)
  3. 基于微信小程序的失物招领系统的设计与实现
  4. EXCEL_VBA_多个工作簿、相同区域的数据复制到一张工作簿的同一sheet中
  5. Threejs实现绘制地球,地理位置标注、经纬度转换世界坐标threejs坐标
  6. C++模版:包含模型、显式实例化、分离模型(详解)
  7. video属性及操作
  8. 游戏盒子-账号(小号)交易系统的小结
  9. Python中IO流与File对象
  10. 智能阀门定位器如何在线更换