Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天

本文通过实例演示如何使用OpenCV进行图像的颜色替换操作,重点介绍了如何调整二值化参数来精确选择并替换图像中的特定颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天写美女换装案例的时候,忽然间想到,相同的代码可以复用照片底色中,所以本文继续夯实一下对应的效果吧。

本案例使用的素材来源网络,如有侵权,联系橡皮擦删除

Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天

二值化参数调整

使用上篇博客,实现的一个小功能,进行 inRange()函数的参数值选择。

代码如下,先替换红色背景为绿色:

import cv2
import numpy as np
# 该图片即为上图待换色的图片
img = cv2.imread('photo.jpg')

def nothing(x):
    pass

winName = 'getTrackbarPos'
# 新建窗口
cv2.namedWindow(winName, cv2.WINDOW_NORMAL)

cv2.createTrackbar('LowerbH', winName, 10, 255, nothing)
cv2.createTrackbar('LowerbS', winName, 43, 255, nothing)
cv2.createTrackbar('LowerbV', winName, 46, 255, nothing)

cv2.createTrackbar('UpperbH', winName, 180, 255, nothing)
cv2.createTrackbar('UpperbS', winName, 255, 255, nothing)
cv2.createTrackbar('UpperbV', winName, 255, 255, nothing)
# 转换hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
while(1):
    # 函数cv2.getTrackbarPos()范围当前滑块对应的值
    lowerbH = cv2.getTrackbarPos('LowerbH', winName)
    LowerbS = cv2.getTrackbarPos('LowerbS', winName)
    LowerbV = cv2.getTrackbarPos('LowerbV', winName)
    upperbH = cv2.getTrackbarPos('UpperbH', winName)
    upperbS = cv2.getTrackbarPos('UpperbS', winName)
    upperbV = cv2.getTrackbarPos('UpperbV', winName)

    lower_red = np.array([lowerbH, LowerbS, LowerbV])
    upper_red = np.array([upperbH, upperbS, upperbV])
    mask = cv2.inRange(hsv, lower_red, upper_red)

    cv2.imshow(winName, mask)

    if cv2.waitKey(1) == ord('q'):
        break

cv2.destroyAllWindows()

运行效果
Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天
经过不懈的努力,最终得到的相关参数如下:
Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天
运行颜色替换代码效果如下:

import cv2 as cv
import numpy as np
def change_clothes(src):
    # 图像二值化
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    hsv1 = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)
    # cv.imshow("hsv1",hsv1)
    # 使用 inRange()函数实现二值化
    lowerb = np.array([0, 250, 219])
    upperb = np.array([10, 255, 255])
    dst = cv.inRange(hsv, lowerb, upperb)

    # 颜色直接替换
    rows, cols, channels = src.shape
    for i in range(rows):
        for j in range(cols):
            if dst[i, j] == 255:
                # 此处替换颜色,为 BGR 通道
                src[i, j] = (0, 255, 0)
    cv.imshow('src', src)

if __name__ == "__main__":
    src = cv.imread("./photo.jpg")
    change_clothes(src)
    cv.waitKey()
    cv.destroyAllWindows()

Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天
有红色边缘,后续学习到新的内容在进行更正吧,主要是颜色区域的问题。

替换蓝色的时候,问题就比较小。

蓝色相关参数。
Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天
核心代码为:

 # 使用 inRange()函数实现二值化
 lowerb = np.array([100, 48, 108])
 upperb = np.array([130, 255, 255])

运行之后效果满意~

Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天

OpenCV 尾声

1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?

空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。

想学 Python 爬虫,可以订阅橡皮擦专栏哦~ 🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲


今天是持续写作的第 58 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值