2019年5月12日 星期日

1051549的作業4

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

完成結果

結論:這個膚色偵測公式對於亞洲人,不那麼黑的非洲人,以及白人效果特別好,但是太黑的黑人會被認為是背景

沒有留言:

張貼留言