Подтвердить что ты не робот

Обработка изображений - сегментирование одежды с использованием opencv

image

Я работаю над идентификацией одежды, используя opencv. В качестве первого шага мне нужно сегментировать футболку, удаляя лицо и руки с изображения. Любое предложение приветствуется.

4b9b3361

Ответ 1

Предлагаю следующий подход:

  1. Используйте алгоритм обнаружения Adrian Rosebrock для обнаружения кожи (спасибо вам за Розу Грончи за его комментарий).
  2. Используйте алгоритм роста области на карте дисперсии. Начальное семя можно рассчитать, используя этап 1 (дополнительную информацию см. В прилагаемом коде).

код:

%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));

результат после этапа 1 (обнаружение кожи):

skin detection

конечный результат:

final result

Комментарии:

  1. Этап 1 вычисляется с использованием следующего алгоритма.
  2. Здесь можно загрузить функцию роста региона.
  3. Решение не является совершенным. Например, он может потерпеть неудачу, если текстура рубашки похожа на текстуру фона. Но я думаю, что это может быть хорошим началом.
  4. Еще одно улучшение, которое можно сделать, - это использовать алгоритм улучшения более совершенного региона, который не превращается в местоположение skinMask. Кроме того, вместо использования алгоритма роста области дважды независимо, результат второго вызова роста области может быть основан на результате от первого.