Python OpenCV 美女换装,图像处理取经之旅第 19 天
今天學習目標,依舊是前面知識的綜合運用,基礎夯實之后,才能繼續深入學習
本篇博客目標,給下面這個紅衣服美女,換成黃顏色衣服。
案例中用到的美女來源網絡,只為學習,如有侵權,聯系橡皮擦刪除,女生真漂亮。
第一步,把美女的衣服選中
對于這種對比明顯的圖像,直接二值化,看一下紅色衣服部分能否被選中出來。
import cv2 as cvdef change_clothes(src):# 圖像二值化gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)thresh, bin_img = cv.threshold(gray, 100, 255, cv.THRESH_BINARY)cv.imshow("gray", gray)cv.imshow("bin_img", bin_img)if __name__ == "__main__":src = cv.imread("./mv.jpg")change_clothes(src)cv.waitKey()cv.destroyAllWindows()調整了半天數值,也沒有發現一個比較好的效果,故放棄。
檢索之后,一個新的函數映入橡皮擦視線。
inRange()函數實現二值化
該函數的語法格式為:
dst = cv2.inRange(hsv, lowerb, upperb, dst=None)函數目的是將介于[lowerb, upperb]間的像素值變成 255,其他變為 0。
參數說明如下:
- hsv:指的是原圖,但是需要注意圖像格式
- lowerb:指的是圖像中低于這個 lowerb 的值,圖像值變為 0
- upperb:指的是圖像中高于這個 upperb 的值,圖像值變為 0
- 而在 lowerb ~ lowerb 之間的值變成 255
正常讀入的 BGR 圖像,需要提前轉換成 HSV 格式,代碼如下
hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)正式編碼之前,先獲取一下衣服的紅色 RGB 值。用畫圖工具操作即可。
這里會用到 HSV 色彩空間 的圖像,這部分具體后面細說,本案例先應用起來。
HSV 即 Hue(色調),Saturation(飽和度)和 Value(亮度)三個 channel
對照上述表格,我們現在要找的是紅色的衣服,那么選擇的數字如下
紅色框中是 lowerb 的值,綠色框中是 upperb 的值。
修改代碼如下:
import cv2 as cv import numpy as npdef change_clothes(src):# 圖像二值化hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)# 使用 inRange()函數實現二值化lowerb = np.array([38, 96, 80])upperb = np.array([255, 255, 255])dst = cv.inRange(hsv, lowerb, upperb)rows, cols, channels = src.shapefor i in range(rows):for j in range(cols):if dst[i, j] == 255:# 此處替換顏色,為 BGR 通道src[i, j] = (0, 255, 255)cv.imshow('src', src)if __name__ == "__main__":src = cv.imread("./mv.jpg")change_clothes(src)cv.waitKey()cv.destroyAllWindows()運行之后的效果如下圖所示,有點丑,技術能力還是不過關
第二步,二值化優化
有了第一步的經驗,可以繼續后面的操作了,猜想使用 inRange 函數實現二值化操作中參數設置的不好,所以做了下面一個滑動條的案例。
先看一下最終實現的效果,目標只要裙子部分顯示成白色。
代碼如下,初學階段,還有很多不明白的地方,只能先寫出如下代碼了,希望有更好辦法的大佬,提供一下相關資料,或者學習方向,感謝:
拿橡皮擦舉例的這個圖而言,最終得到的參數如下:
以上數據代入剛才的程序,得到的換裝效果如下:
核心部分代碼:
使用的直接替換,效果不好,接下來試試相關函數。
采用 圖像相加的方式,修改代碼如下:
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, 176, 91])upperb = np.array([255, 255, 255])dst = cv.inRange(hsv, lowerb, upperb)dst_inv = cv.bitwise_not(dst)"""# 顏色直接替換rows, cols, channels = src.shapefor i in range(rows):for j in range(cols):if dst[i, j] == 255:# 此處替換顏色,為 BGR 通道src[i, j] = (0, 255, 255)"""# 讀取一張yellow 圖片yellow = cv.imread("./yellow.png")# 蛋黃的裙子result1 = cv.add(yellow,yellow,mask=dst)# 黑色的裙子result2 =cv.add(src,1,mask=dst_inv)ret = cv.addWeighted(result2,1,result1,0.5,10)# ret = cv.add(result2,result1)cv.imshow('ret', result1)運行之后,效果依舊不滿意,看來知識儲備量,還是不夠,當然,我使用純色背景嘗試了一下,這個效果不錯,但是換衣服顏色,還是需要繼續努力學習啦。
OpenCV 尾聲
1 個小時又過去了,對 Python OpenCV 相關的知識點,你掌握了嗎?
空閑之余,可以訂閱橡皮擦的爬蟲百例課程學習爬蟲知識。
想學 Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲🈲 點擊發現驚喜 🈲🈲🈲🈲
今天是持續寫作的第 58 / 100 天。
如果你有想要交流的想法、技術,歡迎在評論區留言。
如果你想跟博主建立親密關系,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯網高級網蟲。
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏。
總結
以上是生活随笔為你收集整理的Python OpenCV 美女换装,图像处理取经之旅第 19 天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html语言文本框的符号,如何将文本框中
- 下一篇: Yii2的一些问题