Skin Color Detection
利用你所學的顏色知識,撰寫一個程式來偵測一張輸入圖片中的皮膚區域並將其標示出來
使用環境
- windows10
- python 3.7
- opencv 4.0
- numpy 1.15.1
- matplotlib 2.2.3
實作說明
運行步驟圖
一開始
cv.imread()
讀圖進來,opencv預設彩圖是BGR模式
轉換成HSV,BGRA,YCrCb圖
hsv_img = cv.cvtColor(img, cv.COLOR_BGR2HSV)
Bgra_img = cv.cvtColor(img, cv.COLOR_BGR2BGRA)
Ycrcb_img = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)
並把HSV,BGRA,YCrCb通道分離出來,
(B,G,R,A) = cv.split(Bgra_img)
(H,S,V) = cv.split(Hsv_img)
(Y,Cb,Cr) = cv.split(Ycrcb_img)
若要套用以下公式判斷,需要調整HSV三通道配置一般HSV的理論值是
H = 0 ~ 360
S = 0 ~ 1
V = 0 ~ 1而opencv對於轉換後的HSV設定是
H = 0 ~ 180
S = 0 ~ 255
V = 0 ~ 255
根據論文人體皮膚感測理論,列出以下條件判斷式,若在條件範圍內的點是白色,反之,則是黑色,最後以單通道顯示結果
if 0.0 <= H <= 50.0 and 0.23 <= S <= 0.68 \
and R > 95 and G > 40 and B > 20 \
and R > G and R > B and | R - G | > 15 and A > 15 :
dstImg = 255
elif R > 95 and G > 40 and B > 20 \
and R > G and R > B and | R - G | > 15 and A > 15 \
and Cr > 135 and Cb > 85 and Y > 80 \
and Cr <= (1.5862*Cb)+20 and Cr >= (0.3448*Cb)+76.2069 \
and Cr >= (-4.5652*Cb)+234.5652 and Cr <= (-1.15*Cb)+301.75 \
and Cr <= (-2.2857*Cb)+432.85:
dstImg = 255
else:
dstImg = 0
處理完結果用
matplotlib.pyplot
顯示圖片import matplotlib.pyplot as plt
plt.subplot(122),plt.imshow(dstImg, cmap='gray')
plt.title('skin dection'),plt.axis("off")
plit.show()
設定顯示圖像以及儲存圖像的尺寸大小
plt.rcParams['savefig.dpi'] = 300 #圖片像素
plt.rcParams['figure.dpi'] = 300 #分辨率
# 默認的像素:[6.0,4.0],分辨率為100 圖片尺寸為 600&400
# 指定dpi=200,圖片尺寸為 1200*800
# 指定dpi=300,圖片尺寸為 1800*1200
完成結果
結論:這個膚色偵測公式對於亞洲人,不那麼黑的非洲人,以及白人效果特別好,但是太黑的黑人會被認為是背景
沒有留言:
張貼留言