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

举报
红目香薰 发表于 2023/02/13 16:47:35 2023/02/13
【摘要】 OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色 前言 蓝背景证件照替换白色 蓝背景证件照替换红色 总结 颜色空间 HSV颜色空间

 编辑

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 颜色空间可以是依赖设备,也可以是独立于设备的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。