Python OpenCV 修改一寸照片底色,圖像處理取經(jīng)之旅第 20 天

昨天寫美女換裝案例的時候,忽然間想到,相同的代碼可以復(fù)用照片底色中,所以本文繼續(xù)夯實一下對應(yīng)的效果吧。

本案例使用的素材來源網(wǎng)絡(luò),如有侵權(quán),聯(lián)系橡皮擦刪除

20210119204317561[1].png

二值化參數(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()

運行效果


20210119204739142[1].gif

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


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()函數(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()
20210119205635611[1].png

有紅色邊緣,后續(xù)學(xué)習(xí)到新的內(nèi)容在進行更正吧,主要是顏色區(qū)域的問題。

替換藍色的時候,問題就比較小。

藍色相關(guān)參數(shù)。

20210119205948403[1].png

核心代碼為:

 # 使用 inRange()函數(shù)實現(xiàn)二值化
 lowerb = np.array([100, 48, 108])
 upperb = np.array([130, 255, 255])

運行之后效果滿意~

20210119210130505[1].png

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>。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容