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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV皮肤检测技术对比与总结

發(fā)布時間:2024/3/24 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV皮肤检测技术对比与总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

opencv做皮膚檢測的技術(shù)總結(jié)。那首先列一些現(xiàn)在主流的皮膚檢測的方法都有哪些:

  • RGB color space
  • Ycrcb之cr分量+otsu閾值化
  • YCrCb中133<=Cr<=173 77<=Cb<=127
  • HSV中 7<H<20 28<S<256 50<V<256
  • 基于橢圓皮膚模型的皮膚檢測
  • opencv自帶膚色檢測類AdaptiveSkinDetector
  • 一、基于RGB的皮膚檢測

    根據(jù)RGB顏色模型找出定義好的膚色范圍內(nèi)的像素點,范圍外的像素點設(shè)為黑色。

    查閱資料后可以知道,前人做了大量研究,膚色在RGB模型下的范圍基本滿足以下約束:

    在均勻光照下應(yīng)滿足以下判別式:

    R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>B

    在側(cè)光拍攝環(huán)境下:

    R>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B

    既然判別式已經(jīng)確定了,所以按照判別式寫程序就很簡單了。

    /*基于RGB范圍的皮膚檢測*/ Mat RGB_detect(Mat& img) {/*R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>BORR>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B*/Mat detect = img.clone();detect.setTo(0);if (img.empty() || img.channels() != 3){return detect;}for (int i = 0; i < img.rows; i++){for (int j = 0; j < img.cols; j++){uchar *p_detect = detect.ptr<uchar>(i, j);uchar *p_img = img.ptr<uchar>(i, j);if ((p_img[2] > 95 && p_img[1]>40 && p_img[0] > 20 &&(MAX(p_img[0], MAX(p_img[1], p_img[2])) - MIN(p_img[0], MIN(p_img[1], p_img[2])) > 15) &&abs(p_img[2] - p_img[1]) > 15 && p_img[2] > p_img[1] && p_img[1] > p_img[0]) ||(p_img[2] > 200 && p_img[1] > 210 && p_img[0] > 170 && abs(p_img[2] - p_img[1]) <= 15 &&p_img[2] > p_img[0] && p_img[1] > p_img[0])){p_detect[0] = p_img[0];p_detect[1] = p_img[1];p_detect[2] = p_img[2];}}}return detect; }

    檢測效果如下:

    從檢測結(jié)果可以看出,皮膚的檢測效果并不好,首先皮膚檢測的完整性并不高,一些稍微光線不好的區(qū)域也沒法檢測出皮膚來。第二,這種基于RBG范圍來判定皮膚的算法太受光線的影響了,魯棒性確實不好。

    二、基于橢圓皮膚模型的皮膚檢測

    經(jīng)過前人學(xué)者大量的皮膚統(tǒng)計信息可以知道,如果將皮膚信息映射到Y(jié)CrCb空間,則在CrCb二維空間中這些皮膚像素點近似成一個橢圓分布。因此如果我們得到了一個CrCb的橢圓,下次來一個坐標(biāo)(Cr, Cb)我們只需判斷它是否在橢圓內(nèi)(包括邊界),如果是,則可以判斷其為皮膚,否則就是非皮膚像素點。

    /*基于橢圓皮膚模型的皮膚檢測*/ Mat ellipse_detect(Mat& src) {Mat img = src.clone();Mat skinCrCbHist = Mat::zeros(Size(256, 256), CV_8UC1);//利用opencv自帶的橢圓生成函數(shù)先生成一個膚色橢圓模型ellipse(skinCrCbHist, Point(113, 155.6), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(255, 255, 255), -1);Mat ycrcb_image;Mat output_mask = Mat::zeros(img.size(), CV_8UC1);cvtColor(img, ycrcb_image, CV_BGR2YCrCb); //首先轉(zhuǎn)換成到Y(jié)CrCb空間for (int i = 0; i < img.cols; i++) //利用橢圓皮膚模型進行皮膚檢測for (int j = 0; j < img.rows; j++){Vec3b ycrcb = ycrcb_image.at<Vec3b>(j, i);if (skinCrCbHist.at<uchar>(ycrcb[1], ycrcb[2]) > 0) //如果該落在皮膚模型橢圓區(qū)域內(nèi),該點就是皮膚像素點output_mask.at<uchar>(j, i) = 255;}Mat detect;img.copyTo(detect,output_mask); //返回膚色圖return detect; }

    ?檢測效果:

    這種基于膚色橢圓模型的算法的皮膚檢測較上面算法在效果上有著較大的提升,基本上改檢測的皮膚都檢測到了,對光線的抗干擾能力也是比較強的,檢測出來的圖像都比較干凈,背景雜質(zhì)較少。

    三、YCrCb顏色空間Cr分量+Otsu法閾值分割

    這里先簡單介紹YCrCb顏色空間。

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

    該方法的原理也很簡單:

    a.將RGB圖像轉(zhuǎn)換到Y(jié)CrCb顏色空間,提取Cr分量圖像

    b.對Cr做自二值化閾值分割處理(Otsu法)

    /*YCrCb顏色空間Cr分量+Otsu法*/ Mat YCrCb_Otsu_detect(Mat& src) {Mat ycrcb_image;cvtColor(src, ycrcb_image, CV_BGR2YCrCb); //首先轉(zhuǎn)換成到Y(jié)CrCb空間Mat detect;vector<Mat> channels;split(ycrcb_image, channels);Mat output_mask = channels[1];threshold(output_mask, output_mask, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);src.copyTo(detect, output_mask);return detect; }

    ?檢測效果:

    四、基于YCrCb顏色空間Cr,Cb范圍篩選法

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

    /*YCrCb顏色空間Cr,Cb范圍篩選法*/ Mat YCrCb_detect(Mat & src) {Mat ycrcb_image;int Cr = 1;int Cb = 2;cvtColor(src, ycrcb_image, CV_BGR2YCrCb); //首先轉(zhuǎn)換成到Y(jié)CrCb空間Mat output_mask = Mat::zeros(src.size(), CV_8UC1);for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){uchar *p_mask = output_mask.ptr<uchar>(i, j);uchar *p_src = ycrcb_image.ptr<uchar>(i, j);if (p_src[Cr] >= 133 && p_src[Cr] <= 173 && p_src[Cb] >= 77 && p_src[Cb] <= 127){p_mask[0] = 255;}}}Mat detect;src.copyTo(detect, output_mask);;return detect; }

    ?檢測效果:

    五、HSV顏色空間H范圍篩選法

    同樣地,也是在不同的顏色空間下采取相應(yīng)的顏色范圍將皮膚分割出來。

    /*HSV顏色空間H范圍篩選法*/ Mat HSV_detector(Mat& src) {Mat hsv_image;int h = 0;int s = 1;int v = 2;cvtColor(src, hsv_image, CV_BGR2HSV); //首先轉(zhuǎn)換成到Y(jié)CrCb空間Mat output_mask = Mat::zeros(src.size(), CV_8UC1);for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){uchar *p_mask = output_mask.ptr<uchar>(i, j);uchar *p_src = hsv_image.ptr<uchar>(i, j);if (p_src[h] >= 0 && p_src[h] <= 20 && p_src[s] >=48 && p_src[v] >=50){p_mask[0] = 255;}}}Mat detect;src.copyTo(detect, output_mask);;return detect; }

    檢測效果:

    ?

    這篇文章對各大主流的皮膚檢測算法做了個總結(jié)和實現(xiàn)。其實說白了,每個算法的思想都是大同小異的,都是根據(jù)總結(jié)出來的一些經(jīng)驗,設(shè)定皮膚顏色的范圍,再將其過濾出來,不同的只是過濾的過程在不同的顏色空間下進行而已。我們可以根據(jù)自己的應(yīng)用場景,適當(dāng)?shù)匦薷倪@些范圍,以獲得滿意的結(jié)果。可以改善的方向就是,我們可以用合適的濾波器或者形態(tài)學(xué)處理一些噪聲,來使得提取出來的皮膚更為干凈。

    總結(jié)

    以上是生活随笔為你收集整理的OpenCV皮肤检测技术对比与总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。