<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Python 代碼實現(xiàn)人體膚色檢測

          共 6003字,需瀏覽 13分鐘

           ·

          2021-04-02 10:20

          點擊上方小白學(xué)視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達


          本文轉(zhuǎn)自:機器算法那些事

          概述


          本文中的人體膚色檢測功能采用 OpenCV 庫實現(xiàn)。OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上. 它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。

          本文主要使用了OpenCV的圖像色域轉(zhuǎn)換, 顏色通道分割, 高斯濾波, OSTU自動閾值等功能.

          參考資料

          OpenCV探索之路:皮膚檢測技術(shù)

          學(xué)習(xí)OpenCV—膚色檢測

          準備工作

          安裝 Python-OpenCV 庫
             
          pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple

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

          安裝 Numpy 科學(xué)計算庫
             
          pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple

          圖像的基本操作

             
          import numpy as npimport cv2imname =  "6358772.jpg"# 讀入圖像'''使用函數(shù) cv2.imread() 讀入圖像。這幅圖像應(yīng)該在此程序的工作路徑,或者給函數(shù)提供完整路徑.警告:就算圖像的路徑是錯的,OpenCV 也不會提醒你的,但是當(dāng)你使用命令print(img)時得到的結(jié)果是None。'''img = cv2.imread(imname, cv2.IMREAD_COLOR)'''imread函數(shù)的第一個參數(shù)是要打開的圖像的名稱(帶路徑)第二個參數(shù)是告訴函數(shù)應(yīng)該如何讀取這幅圖片. 其中    cv2.IMREAD_COLOR 表示讀入一副彩色圖像, alpha 通道被忽略, 默認值    cv2.IMREAD_ANYCOLOR 表示讀入一副彩色圖像    cv2.IMREAD_GRAYSCALE 表示讀入一副灰度圖像    cv2.IMREAD_UNCHANGED 表示讀入一幅圖像,并且包括圖像的 alpha 通道'''# 顯示圖像'''使用函數(shù) cv2.imshow() 顯示圖像。窗口會自動調(diào)整為圖像大小。第一個參數(shù)是窗口的名字,其次才是我們的圖像。你可以創(chuàng)建多個窗口,只要你喜歡,但是必須給他們不同的名字.'''cv2.imshow("image", img) # "image" 參數(shù)為圖像顯示窗口的標題, img是待顯示的圖像數(shù)據(jù)cv2.waitKey(0) #等待鍵盤輸入,參數(shù)表示等待時間,單位毫秒.0表示無限期等待cv2.destroyAllWindows() # 銷毀所有cv創(chuàng)建的窗口# 也可以銷毀指定窗口:#cv2.destroyWindow("image") # 刪除窗口標題為"image"的窗口# 保存圖像'''使用函數(shù) 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信號的特定部分疊加到一起. 色度 則定義了顏色的兩個方面─色調(diào)與飽和度,分別用 Cr 和 Cb 來表示. 其中, Cr 反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異. 而 Cb 反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異.

          該方法的原理也很簡單:

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

          • 對 Cr 分量進行高斯濾波

          • 對Cr做自二值化閾值分割處理 OSTU 法

          關(guān)于高斯濾波

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

             
          # 膚色檢測之一: 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ù)窗口大小來計算高斯函數(shù)標準差cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 對cr通道分量進行高斯濾波# 根據(jù)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范圍篩選法

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

             
          # 膚色檢測之二: YCrCb中 140<=Cr<=175 100<=Cb<=120img = 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)建一個全0的矩陣,用于保存圖像數(shù)據(jù)(x, y) = cr.shape # 獲取源圖像數(shù)據(jù)的長和寬
          # 遍歷圖像, 判斷Cr和Br通道的數(shù)值, 如果在指定范圍中, 則置把新圖像的點設(shè)為255,否則設(shè)為0for 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] = 255else: skin2[i][j] = 0
          cv2.imshow(imname, img)cv2.imshow(imname + " Skin2 Cr+Cb", skin2)

          檢測效果

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

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

             
          # 膚色檢測之三: HSV中 7<H<20 28<S<256 50<V<256img = 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)建一個全0的矩陣,用于保存圖像數(shù)據(jù)(x, y) = _h.shape # 獲取源圖像數(shù)據(jù)的長和寬
          # 遍歷圖像, 判斷HSV通道的數(shù)值, 如果在指定范圍中, 則置把新圖像的點設(shè)為255,否則設(shè)為0for 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] = 255else: skin3[i][j] = 0
          cv2.imshow(imname, img)cv2.imshow(imname + " Skin3 HSV", skin3)

          檢測效果

          三種檢測算法效果對比

          項目內(nèi)文件截圖


          Python人體膚色檢測


          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99久久人妻无码中文字幕系列 | 北条麻妃人妻上门在线播放 | 99在线视频精品 | 中文字幕 日韩欧美 | 色婷婷久久综合中文久久蜜桃Av |