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

举报
梦想橡皮擦 发表于 2021/09/17 09:52:25 2021/09/17
【摘要】 昨天写美女换装案例的时候,忽然间想到,相同的代码可以复用照片底色中,所以本文继续夯实一下对应的效果吧。本案例使用的素材来源网络,如有侵权,联系橡皮擦删除 二值化参数调整使用上篇博客,实现的一个小功能,进行 inRange()函数的参数值选择。代码如下,先替换红色背景为绿色:import cv2import numpy as np# 该图片即为上图待换色的图片img = cv2.imread(...

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

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

二值化参数调整

使用上篇博客,实现的一个小功能,进行 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()

运行效果

经过不懈的努力,最终得到的相关参数如下:

运行颜色替换代码效果如下:

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()

有红色边缘,后续学习到新的内容在进行更正吧,主要是颜色区域的问题。

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

蓝色相关参数。

核心代码为:

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

运行之后效果满意~

OpenCV 尾声

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

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

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


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


博主 ID:梦想橡皮擦,希望大家点赞评论收藏

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。