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