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

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

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

20210119204317561[1].png

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


20210119204739142[1].gif

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


20210119205443996[1].png

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

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

替換藍(lán)色的時(shí)候,問題就比較小。

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

20210119205948403[1].png

核心代碼為:

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

運(yùn)行之后效果滿意~

20210119210130505[1].png

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

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

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

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