s1081423 作業5
一、作業說明
膚色偵測 Skin
Color Detection
利用你所學的 顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚區域並將其標示出。(請用附件中的三張照片做測試)
Write a program that detect skin color from an image.
二、程式功能
根據使用者選擇模式(0、1),利用不同的設定,輸出偵測到的皮膚(以白色顯示)
下圖左至右順序為 : 原圖、模式0、模式1
三、開發環境
Windows 10
Visual Studio 2022
OpenCV 4.7.0
四、實作討論
(1)以BGR格式讀取原圖,並將圖像透過cvtColor()轉為BGRA、HSV、YCrCb三種格式,以便進行後續篩選步驟。
(2)為了後續方便顯示偵測到的皮膚資訊,先建立一個與原圖相同長寬、且全黑的outputImage畫布,之後將偵測到皮膚的位子標示為白色
(3)以for迴圈搭配.at()方式遍歷整張圖片,以像素為單位將三種格式圖片的像素傳至步驟四的isSkinPixel()函式進行膚色的檢測。
(4)根據論文”Human Skin Detection Using RGB, HSV and YCbCr Color Models”中提到的兩種threshold設定:
(a.) 0.0 <= H <=
50.0
0.23
<= S <= 0.68
R
> 95 and G > 40
B
> 20 and R > G and A > 15 and R > B
| R - G | > 15
(b.) R > 95 and G
> 40 and B > 20 and A > 15
R
> G and R > B and | R - G | > 15
Cr
> 135 and Cb > 85 Y > 80
Cr
<= (1.5862*Cb)+20
Cr>=(0.3448*Cb)+76.2069
Cr
>= (-4.5652*Cb)+234.5652
Cr
<= (-1.15*Cb)+301.75
Cr
<= (-2.2857*Cb)+432.85
(H : Hue ; S: Saturation ; R : Red ; B: Blue
; G : Green ; Cr, Cb : Chrominance components ; Y : luminance component)
透過以上兩種模式設定決定此像素是否屬於皮膚,並回傳boolean值,若回傳後接收到的是True,就在步驟(2)的outputImage上同位子的像素塗成白色。
模式0的設定
模式1的設定
(5)獲得過濾出皮膚的影像。此處可以發現下圖左(模式0)的篩選較為嚴格,臉部並不是所有部分都被偵測成為皮膚,但對於其他部分(例如頭髮)過濾效果較佳;而下圖右(模式1)則反之。
留言
張貼留言