美文网首页Python精选Python_图像处理python
Python OpenCV 修改一寸照片底色,图像处理取经之旅第

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

作者: 梦想橡皮擦 | 来源:发表于2021-11-17 12:33 被阅读0次

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

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

    20210119204317561[1].png

    二值化参数调整

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

    运行效果


    20210119204739142[1].gif

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


    20210119205443996[1].png

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

    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()
    
    20210119205635611[1].png

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

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

    蓝色相关参数。

    20210119205948403[1].png

    核心代码为:

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

    运行之后效果满意~

    20210119210130505[1].png

    OpenCV 尾声

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

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

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


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


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

    相关文章

      网友评论

        本文标题:Python OpenCV 修改一寸照片底色,图像处理取经之旅第

        本文链接:https://www.haomeiwen.com/subject/bzeltrtx.html