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

Posted 红目香薰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV这么简单为啥不学——1.11蓝背景证件照替换白色或红色相关的知识,希望对你有一定的参考价值。

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蓝背景证件照替换白色或红色的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV这么简单为啥不学——1.9cvtColor颜色空间转换(全色值效果演示)

OpenCV这么简单为啥不学——2逐帧播放视频(VideoCapture函数waitKey函数0xFF == ord(‘1‘))

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

OpenCV——证件照自动抠图

opencv学习—图像融合之背景替换

opencv —— floodFill 漫水填充,证件照换背景