Python精选Python_图像处理python

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

2021-11-17  本文已影响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>。

上一篇下一篇

猜你喜欢

热点阅读