OpenCV这么简单为啥不学——1.11蓝背景证件照替换白色或红色
Posted 红目香薰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV这么简单为啥不学——1.11蓝背景证件照替换白色或红色相关的知识,希望对你有一定的参考价值。
OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色
目录
OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色
前言
计算机视觉市场巨大而且持续增长,且这方面没有标准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,可以通过以下步骤实现替换证件照蓝背景为红背景:
- 读取证件照图像;
- 通过颜色识别和阈值处理,提取出蓝色背景区域;
- 将提取出的蓝色背景区域替换为红色背景;
- 将替换后的图像保存。
核心·红色色值
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蓝背景证件照替换白色或红色的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV这么简单为啥不学——1.9cvtColor颜色空间转换(全色值效果演示)
OpenCV这么简单为啥不学——2逐帧播放视频(VideoCapture函数waitKey函数0xFF == ord(‘1‘))