8

imageImage Processing - Dress Segmentacja za pomocą OpenCV

pracuję nad identyfikacją funkcji sukienka użyciu OpenCV. Pierwszym krokiem jest odseparowanie koszulki poprzez zdjęcie twarzy i dłoni z obrazu. Wszelkie sugestie są mile widziane.

+3

Zacznij od zapoznania się z rozwiązaniami do wykrywania skóry (przykład: http://www.pyimagesearch.com/2014/08/18/skin-detection-step-example-using-python-opencv/) –

+1

@ RosaGronchi Nie zgodziłbym się z twoją edycją. Ponieważ odesłałeś nas do algorytmu wykrywania skóry Adriana Rosebrocka, aby rozpocząć, istnieje potrzeba wstępnego przetworzenia przed wykryciem skóry obrazu i wymaga to morfologii obrazu, a tym samym przetwarzania obrazu. Odtworzyłem tag, a także dodałem segmentację obrazu, ponieważ również technicznie segmentujemy skórę. – rayryeng

+0

Segmentacja @rayryeng to klasyczny problem z widzeniem komputerowym, wiele razy algorytmy widzenia komputera obejmują narzędzia do przetwarzania obrazu, ale pytanie: chcę wyodrębnić z obrazu piksele koszulki "nie ma nic wspólnego z przetwarzaniem obrazu. zrób to również (co nie spowoduje, że będzie to problem głębokiego uczenia się) –

Odpowiedz

10

Proponuję następujące podejście:

  1. Używaj algorytm detekcji skóry Adrian ROSEBROCK dla wykrywania skóry (dziękuję za Rosa Gronchi jego komentarzu).
  2. Użyj algorytmu wzrostu regionu na mapie wariancji. Początkowy materiał siewny można obliczyć za pomocą etapu 1 (patrz załączony kod, aby uzyskać więcej informacji).

Kod:

%stage 1: skin detection - Adrian Rosebrock solution 
im = imread(<path to input image>); 
hsb = rgb2hsv(im)*255; 

skinMask = hsb(:,:,1) > 0 & hsb(:,:,1) < 20; 
skinMask = skinMask & (hsb(:,:,2) > 48 & hsb(:,:,2) < 255); 
skinMask = skinMask & (hsb(:,:,3) > 80 & hsb(:,:,3) < 255); 
skinMask = imclose(skinMask,strel('disk',6)); 

%stage 2: calculate top, left and right centroid from the different connected 
%components of the skin 
stats = regionprops(skinMask,'centroid'); 
topCentroid = stats(1).Centroid; 
rightCentroid = stats(1).Centroid; 
leftCentroid = stats(1).Centroid; 
for x = 1 : length(stats) 
    centroid = stats(x).Centroid; 
    if topCentroid(2)>centroid(2) 
     topCentroid = centroid; 
    elseif centroid(1)<leftCentroid(1) 
     leftCentroid = centroid; 
    elseif centroid(1)>rightCentroid(1) 
     rightCentroid = centroid; 
    end 
end 

%first seed - the average of the most left and right centroids. 
centralSeed = int16((rightCentroid+leftCentroid)/2); 

%second seed - a pixel which is right below the face centroid. 
faceSeed = int16(topCentroid); 
faceSeed(2) = faceSeed(2)+40; 

%stage 3: std filter 
varIm = stdfilt(rgb2gray(im)); 

%stage 4 - region growing on varIm using faceSeed and centralSeed 
res1=regiongrowing(varIm,centralSeed(2),centralSeed(1),8); 
res2=regiongrowing(varIm,faceSeed(2),faceSeed(1),8); 
res = res1|res2; 

%noise reduction 
res = imclose(res,strel('disk',3)); 
res = imopen(res,strel('disk',2)); 

wynik po etapie 1 (wykrywania skóry)

skin detection

wynik końcowy:

final result

Uwagi:

  1. Etap 1 jest obliczany za pomocą following algorithm.
  2. Funkcja wzrostu regionu can be downloaded here.
  3. Rozwiązanie nie jest idealne. Na przykład może się nie udać, jeśli tekstura koszulki jest podobna do tekstury tła. Ale myślę, że to może być dobry początek.
  4. Kolejnym ulepszeniem, które można zrobić, jest zastosowanie lepszego algorytmu wzrostu regionu, który nie rośnie w lokalizacji skinMask. Ponadto, zamiast dwukrotnego stosowania algorytmu powiększania regionu, wynik drugiego wywołania regionu może być oparty na wyniku z pierwszego.
+2

Świetna odpowiedź. +1. – rayryeng