2016-10-04 82 views
0

如何去除分割上的皮膚部分?Matlab:去除分割上的皮膚部分

首先,我把這張第一張圖片縮小了一點,因爲圖片有點嚇人,我會在最後一部分給出圖片。

enter image description here

我使用的是RGB &的YCbCr分割,但似乎分割沒有工作。

clear all; 
    close all; 
    clc; 

    img=imread('acne.jpg'); 


%ycbcr segmentation 
    img_ycbcr=img; %image from the previous segmentation 
    ycbcr=rgb2ycbcr(img_ycbcr); 
    cb=ycbcr(:,:,2); 
    cr=ycbcr(:,:,3); 


    %Detect Skin 
    %[r,c,v] = find(cb>=77 & cb<=127 & cr>=133 & cr<=173); 
    [r c v] = find(cb<=77 | cb >=127 | cr<=133 | cr>=173); 
    numid = size(r,1); 

    %Mark Skin Pixels 
    for i=1:numid 
     img_ycbcr(r(i),c(i),:) = 0; 
     % bin(r(i),c(i)) = 1; 
    end 

    figure 
    title('ycbcr segmentation'); 
    imshow(img_ycbcr); 

%============================================================== 
    %rgb segmentation 

img_rgb=img_ycbcr; 
r=img_rgb(:,:,1); 
g=img_rgb(:,:,2); 
b=img_rgb(:,:,3); 


[row col v]= find(b>0.79*g-67 & b<0.78*g+42 & b>0.836*g-14 & b<0.836*g+44); %non skin pixels 
numid=size(row,1); 

for i=1:numid 
    img_rgb(row(i),col(i),:)=0; 
end 


figure 
imshow(img_rgb); 

enter image description here

這裏我的示例:

enter image description here

+3

純色彩這是一個噩夢,因爲痤瘡和圖片上方的明亮皮膚是白色的,幾乎是相同的顏色。我懷疑只用分色這樣做會很困難,你需要檢查例如周圍環境:白色區域大致是白色的,是否被紅色環狀物包圍等 – Adriaan

+0

嗨,謝謝我正在尋找基於顏色的替代品。 –

+0

是的,嘗試一些邊緣檢測! –

回答

2

我阿德里安同意。不要只用顏色來做,而應使用其他信息,如形狀和邊緣。

最後兩個colorplanes似乎有最多造影,讓我們使用其中一個:

Nipple = imread('N8y6Q.jpg') 

Nipple = imadjust(Nipple(:,:,2)); 

imshow(Nipple) 

grayscale of the green plane of the image

[centers, radii] = imfindcircles(Nipple, [30,60]); 

hold on 

imshow(Nipple); 
viscircles(centers, radii); 

grayscale with segmented area

圓形Hough變換是一種可靠的方法如果你知道近似的半徑範圍,並且滿足近似值,就可以找到圓形物體。對象的位置和大小。

如果不是,您可以嘗試其他經典方法,例如(Canny)邊緣檢測,使用霍夫中心點作爲標記 - >區域生長,擬合蛇等等。

+0

只是一個小小的評論:它是痤瘡,而不是乳頭。否則,你可能想去看醫生... – Adriaan

+0

我注意到了。我喜歡用我的變量名稱來表示它,愚蠢的東西更容易記住。即使不相關,它也成爲一種習慣。是的,放棄代碼可能會很尷尬.. – Tapio