昨天寫美女換裝案例的時(shí)候,忽然間想到,相同的代碼可以復(fù)用照片底色中,所以本文繼續(xù)夯實(shí)一下對(duì)應(yīng)的效果吧。
本案例使用的素材來源網(wǎng)絡(luò),如有侵權(quán),聯(lián)系橡皮擦刪除

二值化參數(shù)調(diào)整
使用上篇博客,實(shí)現(xiàn)的一個(gè)小功能,進(jìn)行 inRange()函數(shù)的參數(shù)值選擇。
代碼如下,先替換紅色背景為綠色:
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)
# 轉(zhuǎn)換hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
while(1):
# 函數(shù)cv2.getTrackbarPos()范圍當(dāng)前滑塊對(duì)應(yīng)的值
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()
運(yùn)行效果

經(jīng)過不懈的努力,最終得到的相關(guān)參數(shù)如下:

運(yùn)行顏色替換代碼效果如下:
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()函數(shù)實(shí)現(xiàn)二值化
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()

有紅色邊緣,后續(xù)學(xué)習(xí)到新的內(nèi)容在進(jìn)行更正吧,主要是顏色區(qū)域的問題。
替換藍(lán)色的時(shí)候,問題就比較小。
藍(lán)色相關(guān)參數(shù)。

核心代碼為:
# 使用 inRange()函數(shù)實(shí)現(xiàn)二值化
lowerb = np.array([100, 48, 108])
upperb = np.array([130, 255, 255])
運(yùn)行之后效果滿意~

OpenCV 尾聲
1 個(gè)小時(shí)又過去了,對(duì) Python OpenCV 相關(guān)的知識(shí)點(diǎn),你掌握了嗎?
空閑之余,可以訂閱橡皮擦的爬蟲百例課程學(xué)習(xí)爬蟲知識(shí)。
想學(xué) Python 爬蟲,可以訂閱橡皮擦專欄哦~ ???????? 點(diǎn)擊發(fā)現(xiàn)驚喜 ????????
今天是持續(xù)寫作的第 <font color="red">58</font> / 100 天。
如果你有想要交流的想法、技術(shù),歡迎在評(píng)論區(qū)留言。
如果你想跟博主建立親密關(guān)系,可以關(guān)注同名公眾號(hào) <font color="red">夢(mèng)想橡皮擦</font>,近距離接觸一個(gè)逗趣的互聯(lián)網(wǎng)高級(jí)網(wǎng)蟲。
博主 ID:夢(mèng)想橡皮擦,希望大家<font color="red">點(diǎn)贊</font>、<font color="red">評(píng)論</font>、<font color="red">收藏</font>。