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

二值化參數(shù)調(diào)整
使用上篇博客,實現(xià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)前滑塊對應(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()
運行效果

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

運行顏色替換代碼效果如下:
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ù)實現(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)容在進行更正吧,主要是顏色區(qū)域的問題。
替換藍色的時候,問題就比較小。
藍色相關(guān)參數(shù)。

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

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