写点什么

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

发布于: 2021 年 04 月 07 日
Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天

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


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


二值化参数调整

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


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


import cv2import 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)# 转换hsvhsv = 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 cvimport numpy as npdef 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 爬虫,可以订阅橡皮擦专栏哦~ 🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲




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

发布于: 2021 年 04 月 07 日阅读数: 13
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python OpenCV 修改一寸照片底色,图像处理取经之旅第 20 天