日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python OpenCV 美女换装,图像处理取经之旅第 19 天

發布時間:2023/12/10 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 函數實現二值化操作中參數設置的不好,所以做了下面一個滑動條的案例。

先看一下最終實現的效果,目標只要裙子部分顯示成白色。


代碼如下,初學階段,還有很多不明白的地方,只能先寫出如下代碼了,希望有更好辦法的大佬,提供一下相關資料,或者學習方向,感謝:

import cv2 import numpy as npimg = cv2.imread('mv.jpg')def nothing(x):passwinName = 'getTrackbarPos' # 新建窗口 cv2.namedWindow(winName, cv2.WINDOW_NORMAL)cv2.createTrackbar('LowerbH', winName, 0, 10, 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) # 轉換hsv hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) while(1):# 函數cv2.getTrackbarPos()范圍當前滑塊對應的值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'):breakcv2.destroyAllWindows()

拿橡皮擦舉例的這個圖而言,最終得到的參數如下:

以上數據代入剛才的程序,得到的換裝效果如下:

核心部分代碼:

def change_clothes(src):# 圖像二值化hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)# 使用 inRange()函數實現二值化lowerb = np.array([0, 176, 91])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)

使用的直接替換,效果不好,接下來試試相關函數。

采用 圖像相加的方式,修改代碼如下:

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 天的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。