您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Python中怎么實現人體膚色檢測功能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
安裝 Python-OpenCV 庫
pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple
利用 -i 為pip指令鏡像源, 這里使用電子科技大學的源, 速度比官方源更快.
安裝 Numpy 科學計算庫
pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple
圖像的基本操作
import numpy as np import cv2 imname = "6358772.jpg" # 讀入圖像 ''' 使用函數 cv2.imread() 讀入圖像。這幅圖像應該在此程序的工作路徑,或者給函數提供完整路徑. 警告:就算圖像的路徑是錯的,OpenCV 也不會提醒你的,但是當你使用命令print(img)時得到的結果是None。 ''' img = cv2.imread(imname, cv2.IMREAD_COLOR) ''' imread函數的第一個參數是要打開的圖像的名稱(帶路徑) 第二個參數是告訴函數應該如何讀取這幅圖片. 其中 cv2.IMREAD_COLOR 表示讀入一副彩色圖像, alpha 通道被忽略, 默認值 cv2.IMREAD_ANYCOLOR 表示讀入一副彩色圖像 cv2.IMREAD_GRAYSCALE 表示讀入一副灰度圖像 cv2.IMREAD_UNCHANGED 表示讀入一幅圖像,并且包括圖像的 alpha 通道 ''' # 顯示圖像 ''' 使用函數 cv2.imshow() 顯示圖像。窗口會自動調整為圖像大小。第一個參數是窗口的名字, 其次才是我們的圖像。你可以創建多個窗口,只要你喜歡,但是必須給他們不同的名字. ''' cv2.imshow("image", img) # "image" 參數為圖像顯示窗口的標題, img是待顯示的圖像數據 cv2.waitKey(0) #等待鍵盤輸入,參數表示等待時間,單位毫秒.0表示無限期等待 cv2.destroyAllWindows() # 銷毀所有cv創建的窗口 # 也可以銷毀指定窗口: #cv2.destroyWindow("image") # 刪除窗口標題為"image"的窗口 # 保存圖像 ''' 使用函數 cv2.imwrite() 來保存一個圖像。首先需要一個文件名,之后才是你要保存的圖像。 保存的圖片的格式由后綴名決定. ''' #cv2.imwrite(imname + "01.png", img) cv2.imwrite(imname + "01.jpg", img)
皮膚檢測算法
基于YCrCb顏色空間的Cr分量+Otsu法閾值分割算法
YCrCb 即 YUV ,其中 Y 表示明亮度 Luminance 或 Luma , 也就是灰階值. 而 U 和 V 表示的則是色度 Chrominance 或 Chroma ,作用是描述影像色彩及飽和度, 用于指定像素的顏色. 亮度 是透過RGB輸入信號來建立的, 方法是將RGB信號的特定部分疊加到一起. 色度 則定義了顏色的兩個方面─色調與飽和度,分別用 Cr 和 Cb 來表示. 其中, Cr 反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異. 而 Cb 反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異.
該方法的原理也很簡單:
將RGB圖像轉換到 YCrCb 顏色空間,提取 Cr 分量圖像
對 Cr 分量進行高斯濾波
對Cr做自二值化閾值分割處理 OSTU 法
關于高斯濾波
使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。其實就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會被模糊一點。(當然,也有一些模糊技術不會模糊掉邊界)。OpenCV 提供了四種模糊技術。高斯濾波就是其中一種。實現的函數是 cv2.GaussianBlur()。我們需要指定高斯濾波器的寬和高(必須是奇數)。以及高斯函數沿 X,Y 方向的標準差。如果我們只指定了 X 方向的的標準差,Y 方向也會取相同值。如果兩個標準差都是 0,那么函數會根據核函數的大小自己計算。高斯濾波可以有效的從圖像中去除高斯噪音。如果你愿意的話,你也可以使用函數 cv2.getGaussianKernel() 自己構建一個高斯濾波器。
# 膚色檢測之一: YCrCb之Cr分量 + OTSU二值化 img = cv2.imread(imname, cv2.IMREAD_COLOR) ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把圖像轉換到YUV色域 (y, cr, cb) = cv2.split(ycrcb) # 圖像分割, 分別獲取y, cr, br通道圖像 # 高斯濾波, cr 是待濾波的源圖像數據, (5,5)是值窗口大小, 0 是指根據窗口大小來計算高斯函數標準差 cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 對cr通道分量進行高斯濾波 # 根據OTSU算法求圖像閾值, 對圖像進行二值化 _, skin1 = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) cv2.imshow("image CR", cr1) cv2.imshow("Skin Cr+OSTU", skin1 )
基于YCrCb顏色空間Cr, Cb范圍篩選法
這個方法跟法一其實大同小異,只是顏色空間不同而已。據資料顯示,正常黃種人的Cr分量大約在140至175之間,Cb分量大約在100至120之間。大家可以根據自己項目需求放大或縮小這兩個分量的范圍,會有不同的效果。
# 膚色檢測之二: YCrCb中 140<=Cr<=175 100<=Cb<=120 img = cv2.imread(imname, cv2.IMREAD_COLOR) ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把圖像轉換到YUV色域 (y, cr, cb) = cv2.split(ycrcb) # 圖像分割, 分別獲取y, cr, br通道分量圖像 skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根據源圖像的大小創建一個全0的矩陣,用于保存圖像數據 (x, y) = cr.shape # 獲取源圖像數據的長和寬 # 遍歷圖像, 判斷Cr和Br通道的數值, 如果在指定范圍中, 則置把新圖像的點設為255,否則設為0 for i in range(0, x): for j in range(0, y): if (cr[i][j] > 140) and (cr[i][j] < 175) and (cb[i][j] > 100) and (cb[i][j] < 120): skin2[i][j] = 255 else: skin2[i][j] = 0 cv2.imshow(imname, img) cv2.imshow(imname + " Skin2 Cr+Cb", skin2)
檢測效果
基于HSV顏色空間H,S,V范圍篩選法
這個方法跟上一方法類似,只是顏色空間不同而已。據資料顯示,正常黃種人的H分量大約在7至20之間,S分量大約在28至256之間,V分量大約在50至256之間。大家可以根據自己項目需求放大或縮小這兩個分量的范圍,會有不同的效果。
# 膚色檢測之三: HSV中 7<H<20 28<S<256 50<V<256 img = cv2.imread(imname, cv2.IMREAD_COLOR) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 把圖像轉換到HSV色域 (_h, _s, _v) = cv2.split(hsv) # 圖像分割, 分別獲取h, s, v 通道分量圖像 skin3 = np.zeros(_h.shape, dtype=np.uint8) # 根據源圖像的大小創建一個全0的矩陣,用于保存圖像數據 (x, y) = _h.shape # 獲取源圖像數據的長和寬 # 遍歷圖像, 判斷HSV通道的數值, 如果在指定范圍中, 則置把新圖像的點設為255,否則設為0 for i in range(0, x): for j in range(0, y): if (_h[i][j] > 7) and (_h[i][j] < 20) and (_s[i][j] > 28) and (_s[i][j] < 255) and (_v[i][j] > 50) and (_v[i][j] < 255): skin3[i][j] = 255 else: skin3[i][j] = 0 cv2.imshow(imname, img) cv2.imshow(imname + " Skin3 HSV", skin3)
上述就是小編為大家分享的Python中怎么實現人體膚色檢測功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。