一、作業題目:
利用你所學的顏色的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚區域並將其標示出。
二、操作環境:
作業系統: Windows 10
程式語言:Python 3.8.5
編譯器:Spyder 4
使用python套件:
openCV 4.5.1
numpy 1.20.2
三、操作過程:
1.方法1 :YCRCB 方法 ==> ellipse_detect():
將RGB圖像轉換到YCRCB空間,膚色像素點會聚集到一個橢圓區域。
先定義一個橢圓模型,
然後將每個RGB像素點轉換到YCRCB空間比對是否再橢圓區域,是的話判斷為皮膚。
cv2.ellipse(skinCrCbHist ,(113,155),(23,15),43,0, 360, (255,255,255),-1)
//把膚色轉換聚集到橢圓區域
for i in range(0,x):
for j in range(0,y):
CR= YCRCB[i,j,1]
CB= YCRCB[i,j,2]
if skinCrCbHist [CR,CB]>0:
skin[i,j]= 255
//用兩層 for 迴圈來比較並判斷
2.方法2 cr_otsu()
針對YCRCB中CR分量的處理,將RGB轉換為YCRCB,對CR通道單獨進行otsu處理,otsu方法opencv裡用threshold。
(y, cr, cb) = cv2.split(ycrcb)
cr1 = cv2.GaussianBlur(cr, (5, 5), 0)
_, skin = cv2.threshold(cr1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
//設定 threshold 來判斷
3.方法3 crcb_range_sceening():
基於YCrCb顏色空間Cr, Cb範圍篩選:
類似於第二種方法,只不過是把CR跟CB兩個考慮加進去
skin = np.zeros(cr.shape,dtype= np.uint8)
(x,y)= cr.shape
for i in range(0,x):
for j in range(0,y):
if (cr[i][j]>140)and(cr[i][j])<175 and (cr[i][j]>100) and (cb[i][j])<120:
skin[i][j]= 255
else:
skin[i][j] = 0
//一樣用兩層for迴圈判斷
4.方法4 hsv_detect(image):
還是轉換空間然後每個通道設置一個threshold值綜合考慮,進行二值化操作。
for i in range(0,x):
for j in range(0,y):
if(_h[i][j]>7) and (_h[i][j]<20) and (_s[i][j]>28) and (_s[i][j]<255) and (_v[i][j]>50 ) and (_v[i][j]<255):
skin[i][j] = 255
else:
skin[i][j] = 0
四.執行結果:
方法1:YCRCB
原圖 :
沒有留言:
張貼留言