Python OpenCV实现照片换底色:从基础处理到像素级替换
本文详细介绍如何使用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照片换底色相关内容,请搜索本站历史文章或继续浏览后续文章,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













