昨天写美女换装案例的时候,忽然间想到,相同的代码可以复用照片底色中,所以本文继续夯实一下对应的效果吧。
本案例使用的素材来源网络,如有侵权,联系橡皮擦删除
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].pngOpenCV 尾声
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>。
网友评论