【问题标题】:Image Processing - Dress Segmentation using opencv图像处理 - 使用 opencv 进行服装分割
【发布时间】:2016-08-17 18:09:53
【问题描述】:

我正在使用 opencv 进行服装特征识别。 作为第一步,我需要通过从图像中移除面部和手来分割 T 恤。 任何建议表示赞赏。

【问题讨论】:

  • 首先查看皮肤检测解决方案(例如:pyimagesearch.com/2014/08/18/…
  • @RosaGronchi 我不同意您的编辑。因为您已经向我们介绍了 Adrian Rosebrock 的皮肤检测算法,所以在检测图像的皮肤之前需要进行一些预处理,这需要图像形态学和图像处理。我已经恢复了标签并添加了图像分割,因为我们也在技术上分割皮肤。
  • @rayryeng 分割是一个经典的计算机视觉问题,很多时候计算机视觉算法都涉及到图像处理工具,但问题是:我想从图像中提取衬衫像素”与图像处理无关. 你也可以训练一个 DNN 来做这件事(这不会使它成为一个深度学习问题)
  • 所以这在 2 年前被认为是一个好问题?如果你今天发布这个问题,它会因为过于宽泛而很快被关闭,例如“发布你迄今为止尝试过的内容”和“SO 不是代码编写服务”。
  • @CrisLuengo 我认为这是“太宽泛”的定义,但有时一个问题会因为它有一个很好的答案而获得投票

标签: matlab image-processing computer-vision opencv3.0 image-segmentation


【解决方案1】:

我建议以下方法:

  1. 使用 Adrian Rosebrock 的皮肤检测算法检测皮肤(感谢 Rosa Gronchi 的评论)。
  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. 阶段 1 使用 following algorithm 计算。
  2. 区域增长函数can be downloaded here
  3. 解决方案并不完美。例如,如果衬衫的纹理与背景的纹理相似,它可能会失败。但我认为这可能是一个好的开始。
  4. 另一个可以做的改进是使用更好的区域增长算法,它不会增长到 skinMask 位置。此外,无需两次独立使用区域增长算法,第二次区域增长调用的结果可以基于第一次调用的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多