2014年6月6日 星期五

Digital Image Processing#4 - 色彩空間轉換(Color Space Transform) 與 皮膚偵測(Skin Detection)

文章流程
  • 色彩空間轉換 - HSI 與 YCbCr
  • 皮膚偵測
  • 一句話收尾


第一部分 - 色彩空間轉換 - HSI 與YCbCr

以下曝本人照,選此當原圖,是因為顏色與背景十分複雜



(自宅警備員)

首先轉換HIS到空間

// Cache
 double divide_255 = 1.f/255.f;
 double divide_3 = 1.f/3.f;
 double divide_360 = 1.f/360.f;

 // RGB cache
 double pR = (double)*(pixel_data + 2), pG = (double)*(pixel_data + 1), pB = (double)*(pixel_data); // BGR
 double R = pR * divide_255, G = pG * divide_255, B = pB * divide_255;

 // Compute pixel value for HSI image
 double diffRG = R-G, diffRB = R-B, diffGB = G-B;
 double tempI = (R + G + B) * divide_3;
 double tempS = 1.f - min(R, min(G, B)) / tempI;
 double H_normal = acos(0.5*(diffRG + diffRB) / sqrt(diffRG*diffRG + diffRB*diffGB)) * divide_360;
 double temp_H = (B > G) ? 1.f - H_normal : H_normal;

這邊注意,我是直接照順序放入H. S. I,而沒有刻意像RGB倒轉成BGR

H圖 - Hue Channel


參考其他同學的結果,投影片公式的根號處好像有錯,此為更正公式的結果
另外,測試其他圖片,Hue的計算結果跟同學結果不一致,
檢查好幾遍程式碼,抓不出BUG...,有空再做詳細地比對orz

S圖-Saturation


這邊有發現一個小地方,I圖的 (R+G+B)/3 跟 3/(R+G+B)互為倒數,所以重複利用了一下!

I圖-Intensity


(專注守家門二十二年)

再來轉到YCbCr空間,為了後續皮膚偵測判斷用

 //  Compute pixel value for YCbCr image
 double Y = 0.257*pR + 0.504*pG + 0.098*pB + 16.f;
 double Cb = -0.148*pR - 0.291*pG + 0.439*pB + 128.f;
 double Cr = 0.439*pR - 0.368*pG - 0.071*pB + 128.f;


同之前,直接照順序放入Y. Cb. Cr,沒有刻意像RGB倒轉成BGR

Y圖



Cb圖



Cr圖




第二部分 - 皮膚偵測

 // Control panel to choose condition range
 namedWindow( "Control panel", CV_WINDOW_AUTOSIZE );
 int iY_min = 100;
 createTrackbar("Y_min", "Control panel", &iY_min, 255);
 int iCb_min = 105;
 createTrackbar("Cb_min", "Control panel", &iCb_min, 255);
 int iCb_max = 135;
 createTrackbar("Cb_max", "Control panel", &iCb_max, 255);
 int iCr_min = 135;
 createTrackbar("Cr_min", "Control panel", &iCr_min, 255);
 int iCr_max = 173;
 createTrackbar("Cr_max", "Control panel", &iCr_max, 255);

 ...
 
 if(Y > (uchar)iY_min && ((Cb > (uchar)iCb_min && Cb < (uchar)iCb_max) && 
(Cr > (uchar)iCr_min && Cr < (uchar)iCr_max)))

 ...


對於太多TrackBar占掉畫面大半,造成不方便檢查輸出圖片的狀況,這邊發現一個小技巧,
新增一個專門處理TrackBar的空視窗(不輸出圖片),
就會變成像Control Panel一樣,與輸出圖片分離,操作十分方便


皮膚偵測的範圍條件參考上面的程式碼,
就結果來說,除了臉部皮膚,其他不太理想
周遭太多與皮膚顏色相近的物體,造成雜訊殘留眾多
而手臂因拍照時受光,造成變色,被判斷不是皮膚
如果放寬條件,讓手臂能被判斷是皮膚,則背後的牆壁也會被納入

一句話收尾

能應用很多上課的技巧做改進,期末的時間因素,只能點到此為止了......

沒有留言:

張貼留言