2021年5月16日 星期日

s1073348 影像處理作業4

   一、作業題目: 

    利用你所學的顏色的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚區域並將其標示出。


二、操作環境:


作業系統: 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 

原圖 :
結果:

方法2: YCrCb COLER 空間的Cr分量+Otsu閥值分割

原圖:

中間二極化結果:
最終結果:

方法3:crcb_range_sceening

原圖:
中間二極化結果:
最終結果:

方法4:hsv_detect

原圖:

中間二極化:
最終結果:
































沒有留言:

張貼留言