溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python中怎么實(shí)現(xiàn)人體膚色檢測(cè)功能

發(fā)布時(shí)間:2021-07-05 17:54:17 來(lái)源:億速云 閱讀:161 作者:Leah 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Python中怎么實(shí)現(xiàn)人體膚色檢測(cè)功能,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

安裝 Python-OpenCV 庫(kù)

pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple

利用 -i 為pip指令鏡像源, 這里使用電子科技大學(xué)的源, 速度比官方源更快.

安裝 Numpy 科學(xué)計(jì)算庫(kù)

pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple

圖像的基本操作

import numpy as np  import cv2  imname =  "6358772.jpg"  # 讀入圖像  '''  使用函數(shù) cv2.imread() 讀入圖像。這幅圖像應(yīng)該在此程序的工作路徑,或者給函數(shù)提供完整路徑.  警告:就算圖像的路徑是錯(cuò)的,OpenCV 也不會(huì)提醒你的,但是當(dāng)你使用命令print(img)時(shí)得到的結(jié)果是None。  '''  img = cv2.imread(imname, cv2.IMREAD_COLOR)  '''  imread函數(shù)的第一個(gè)參數(shù)是要打開(kāi)的圖像的名稱(chēng)(帶路徑)  第二個(gè)參數(shù)是告訴函數(shù)應(yīng)該如何讀取這幅圖片. 其中      cv2.IMREAD_COLOR 表示讀入一副彩色圖像, alpha 通道被忽略, 默認(rèn)值      cv2.IMREAD_ANYCOLOR 表示讀入一副彩色圖像      cv2.IMREAD_GRAYSCALE 表示讀入一副灰度圖像      cv2.IMREAD_UNCHANGED 表示讀入一幅圖像,并且包括圖像的 alpha 通道  '''  # 顯示圖像  '''  使用函數(shù) cv2.imshow() 顯示圖像。窗口會(huì)自動(dòng)調(diào)整為圖像大小。第一個(gè)參數(shù)是窗口的名字,  其次才是我們的圖像。你可以創(chuàng)建多個(gè)窗口,只要你喜歡,但是必須給他們不同的名字.  '''  cv2.imshow("image", img) # "image" 參數(shù)為圖像顯示窗口的標(biāo)題, img是待顯示的圖像數(shù)據(jù)  cv2.waitKey(0) #等待鍵盤(pán)輸入,參數(shù)表示等待時(shí)間,單位毫秒.0表示無(wú)限期等待  cv2.destroyAllWindows() # 銷(xiāo)毀所有cv創(chuàng)建的窗口  # 也可以銷(xiāo)毀指定窗口:  #cv2.destroyWindow("image") # 刪除窗口標(biāo)題為"image"的窗口  # 保存圖像  '''  使用函數(shù) cv2.imwrite() 來(lái)保存一個(gè)圖像。首先需要一個(gè)文件名,之后才是你要保存的圖像。  保存的圖片的格式由后綴名決定.  '''  #cv2.imwrite(imname + "01.png", img)   cv2.imwrite(imname + "01.jpg", img)

皮膚檢測(cè)算法

基于YCrCb顏色空間的Cr分量+Otsu法閾值分割算法

YCrCb 即 YUV ,其中 Y 表示明亮度 Luminance 或 Luma , 也就是灰階值. 而 U 和 V 表示的則是色度 Chrominance 或 Chroma ,作用是描述影像色彩及飽和度, 用于指定像素的顏色. 亮度 是透過(guò)RGB輸入信號(hào)來(lái)建立的, 方法是將RGB信號(hào)的特定部分疊加到一起. 色度 則定義了顏色的兩個(gè)方面─色調(diào)與飽和度,分別用 Cr 和 Cb 來(lái)表示. 其中, Cr 反映了RGB輸入信號(hào)紅色部分與RGB信號(hào)亮度值之間的差異. 而 Cb 反映的是RGB輸入信號(hào)藍(lán)色部分與RGB信號(hào)亮度值之間的差異.

該方法的原理也很簡(jiǎn)單:

  •  將RGB圖像轉(zhuǎn)換到 YCrCb 顏色空間,提取 Cr 分量圖像

  •  對(duì) Cr 分量進(jìn)行高斯濾波

  •  對(duì)Cr做自二值化閾值分割處理 OSTU 法

關(guān)于高斯濾波

使用低通濾波器可以達(dá)到圖像模糊的目的。這對(duì)與去除噪音很有幫助。其實(shí)就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會(huì)被模糊一點(diǎn)。(當(dāng)然,也有一些模糊技術(shù)不會(huì)模糊掉邊界)。OpenCV 提供了四種模糊技術(shù)。高斯濾波就是其中一種。實(shí)現(xiàn)的函數(shù)是 cv2.GaussianBlur()。我們需要指定高斯濾波器的寬和高(必須是奇數(shù))。以及高斯函數(shù)沿 X,Y 方向的標(biāo)準(zhǔn)差。如果我們只指定了 X 方向的的標(biāo)準(zhǔn)差,Y 方向也會(huì)取相同值。如果兩個(gè)標(biāo)準(zhǔn)差都是 0,那么函數(shù)會(huì)根據(jù)核函數(shù)的大小自己計(jì)算。高斯濾波可以有效的從圖像中去除高斯噪音。如果你愿意的話(huà),你也可以使用函數(shù) cv2.getGaussianKernel() 自己構(gòu)建一個(gè)高斯濾波器。

# 膚色檢測(cè)之一: YCrCb之Cr分量 + OTSU二值化  img = cv2.imread(imname, cv2.IMREAD_COLOR)  ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把圖像轉(zhuǎn)換到Y(jié)UV色域  (y, cr, cb) = cv2.split(ycrcb) # 圖像分割, 分別獲取y, cr, br通道圖像  # 高斯濾波, cr 是待濾波的源圖像數(shù)據(jù), (5,5)是值窗口大小, 0 是指根據(jù)窗口大小來(lái)計(jì)算高斯函數(shù)標(biāo)準(zhǔn)差  cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 對(duì)cr通道分量進(jìn)行高斯濾波  # 根據(jù)OTSU算法求圖像閾值, 對(duì)圖像進(jìn)行二值化  _, 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范圍篩選法

這個(gè)方法跟法一其實(shí)大同小異,只是顏色空間不同而已。據(jù)資料顯示,正常黃種人的Cr分量大約在140至175之間,Cb分量大約在100至120之間。大家可以根據(jù)自己項(xiàng)目需求放大或縮小這兩個(gè)分量的范圍,會(huì)有不同的效果。

# 膚色檢測(cè)之二: YCrCb中 140<=Cr<=175 100<=Cb<=120  img = cv2.imread(imname, cv2.IMREAD_COLOR) ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把圖像轉(zhuǎn)換到Y(jié)UV色域  (y, cr, cb) = cv2.split(ycrcb) # 圖像分割, 分別獲取y, cr, br通道分量圖像  skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根據(jù)源圖像的大小創(chuàng)建一個(gè)全0的矩陣,用于保存圖像數(shù)據(jù)  (x, y) = cr.shape # 獲取源圖像數(shù)據(jù)的長(zhǎng)和寬  # 遍歷圖像, 判斷Cr和Br通道的數(shù)值, 如果在指定范圍中, 則置把新圖像的點(diǎn)設(shè)為255,否則設(shè)為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)

檢測(cè)效果

基于HSV顏色空間H,S,V范圍篩選法

這個(gè)方法跟上一方法類(lèi)似,只是顏色空間不同而已。據(jù)資料顯示,正常黃種人的H分量大約在7至20之間,S分量大約在28至256之間,V分量大約在50至256之間。大家可以根據(jù)自己項(xiàng)目需求放大或縮小這兩個(gè)分量的范圍,會(huì)有不同的效果。

# 膚色檢測(cè)之三: HSV中 7<H<20 28<S<256 50<V<256  img = cv2.imread(imname, cv2.IMREAD_COLOR)   hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 把圖像轉(zhuǎn)換到HSV色域  (_h, _s, _v) = cv2.split(hsv) # 圖像分割, 分別獲取h, s, v 通道分量圖像  skin3 = np.zeros(_h.shape, dtype=np.uint8)  # 根據(jù)源圖像的大小創(chuàng)建一個(gè)全0的矩陣,用于保存圖像數(shù)據(jù)  (x, y) = _h.shape # 獲取源圖像數(shù)據(jù)的長(zhǎng)和寬  # 遍歷圖像, 判斷HSV通道的數(shù)值, 如果在指定范圍中, 則置把新圖像的點(diǎn)設(shè)為255,否則設(shè)為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中怎么實(shí)現(xiàn)人體膚色檢測(cè)功能了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI