Python OpenCV实现照片换底色:从基础处理到像素级替换

Finn
Finn
发布时间:2026-10-14| 9人浏览过
原创

本文详细介绍如何使用Python和OpenCV库实现照片背景色替换。教程涵盖图片读取、按比例缩放、HSV空间转换、二值化处理以及形态学腐蚀与膨胀操作。核心步骤通过遍历像素点,将特定颜色区域替换为红色或白色,最终实现蓝底换红底或白底的效果,适用于证件照等场景处理。

OpenCV库简介

OpenCV全称为Open Source Computer Vision Library,是一个基于BSD开源许可发布的跨平台计算机视觉库,支持Linux、Windows及Mac OS系统。该库轻量且高效,主要由C函数和少量C++类组成,并提供Python、Ruby、MATLAB等语言接口,实现了图像处理与计算机视觉的多种通用算法。相比PIL库,OpenCV功能更为强大,能够执行人脸识别等复杂应用。

照片换底色完整流程

第一步:读取并显示图片

读取与显示图片


import cv2

# 读入图片
img = cv2.imread(r'D:\test\test_001.jpg', 1)

# 显示图像
cv2.imshow('img', img)

# 窗口等待命令 0表示无限等待
cv2.waitKey(0)

执行上述代码后的运行效果如图所示:

第二步:缩放图片尺寸

图片缩放处理


import cv2
# 读入图片
img = cv2.imread(r'D:\test\test_001.jpg', 1)
rows, cols, channels = img.shape
print(rows, cols, channels)

new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 窗口等待命令 0表示无限等待
cv2.waitKey(0)

将图片尺寸按50%比例缩小,具体运行效果如下:

第三步:彩色图像转换为灰度图像

彩色图像包含RGB三个颜色通道,直接进行腐蚀和膨胀操作效果不佳。因此,需先将彩色图片转换为HSV格式的灰度图像,以便后续进行形态学处理。

彩色转灰度图像


import cv2

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', gray_img)
cv2.waitKey(0)

转换后的运行效果如下:

第四步:图片二值化处理

二值化旨在将图像转换为黑白图像,通过滤除过大或过小的像素值并消除噪声,从灰度图中提取二值图像(将灰度值设定为0或255)。此举能增强黑白对比效果,并显著减少数据量。

图像二值化处理


import cv2
import numpy as np

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', gray_img)

# 图片二值化处理
low_value = np.array([90, 70, 70])
high_value = np.array([110, 255, 255])
binary_img = cv2.inRange(gray_img, low_value, high_value)
cv2.imshow('binary_img', binary_img)

cv2.waitKey(0)

二值化处理后的运行效果如下:

第五步:图像的腐蚀和膨胀操作

图像的膨胀(Dilation)与腐蚀(Erosion)是两种基础形态学运算,主要用于识别图像中的极大和极小区域。膨胀类似于“领域扩张”,使高亮或白色区域扩大,结果图比原图高亮区域更大;腐蚀类似于“领域被蚕食”,使高亮或白色区域缩减细化,结果图比原图高亮区域更小。

  • 图像经过腐蚀处理后,去除了噪声,但会导致图像整体压缩。
  • 对腐蚀后的图像进行膨胀处理,可在去除噪声的同时保持原有形状。

腐蚀与膨胀操作


# 腐蚀膨胀
erode = cv2.erode(binary_img, None, iterations=1)
dilate = cv2.dilate(erode, None, iterations=1)
cv2.imshow('dilate', dilate)

第六步:遍历像素点进行颜色替换

图像由像素点构成。通过定位腐蚀后图片中白色底色处的像素点,并将原图中对应位置的像素点替换为红色或白色,即可实现照片背景色的更换。

像素级颜色替换实现


import cv2
import numpy as np

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)

# 图片二值化处理
low_value = np.array([90, 70, 70])
high_value = np.array([110, 255, 255])
binary_img = cv2.inRange(gray_img, low_value, high_value)

# 腐蚀膨胀
erode = cv2.erode(binary_img, None, iterations=1)
dilate = cv2.dilate(erode, None, iterations=1)
# cv2.imshow('dilate', dilate)

# 遍历替换
for i in range(rows):
 for j in range(cols):
  if dilate[i, j] == 255:
  	# 此处替换颜色,为BGR通道
   new_img[i, j] = (0, 0, 255) # (0, 0, 255)替换为红底 (255, 255, 255)替换为白底

cv2.imshow('red_bg_img', new_img)
# 窗口等待命令 0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()

颜色替换后的运行效果如下:


程序运行成功,可将照片的蓝底替换为红底或白底,验证了利用OpenCV实现照片换底色的可行性。

第七步:其他说明

测试所用图片来源于百度图片搜索,仅用于图像处理知识交流和学习,如有侵权请联系作者删除!

至此,关于Python利用OpenCV给照片换底色的示例代码介绍完毕。如需了解更多Python照片换底色相关内容,请搜索本站历史文章或继续浏览后续文章,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。