图像处理 - 利用opencv进行服装分割

15

image

我正在使用opencv进行服装特征识别。 作为第一步,我需要通过从图像中删除脸和手来分割T恤。 欢迎任何建议。


4
开始查看皮肤检测解决方案(例如:http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/)。 - Rosa Gronchi
2
@RosaGronchi,我不同意你的编辑。因为你让我们参考Adrian Rosebrock的皮肤检测算法作为起点,但在检测图像的皮肤之前需要进行一些预处理,这需要图像形态学和图像处理。我已经恢复了标签,并添加了图像分割,因为我们技术上也在分割皮肤。 - rayryeng
@rayryeng 分割是一个经典的计算机视觉问题,很多时候计算机视觉算法涉及图像处理工具,但问题:“我想从图像中提取衬衫像素”与图像处理无关。您也可以训练DNN来完成这项任务(这不会使其成为深度学习问题)。 - Rosa Gronchi
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rayryeng
3
两年前这个问题被认为是一个好问题吗?如果你今天发布这个问题,它很可能因为过于笼统而被关闭,并会有评论提醒你“请说明你已经尝试了什么”和“SO不是代码编写服务”。 - Cris Luengo
2
@CrisLuengo 我认为这是“范围过大”的定义,但有时一个问题因为有一个好的答案而被赞同。 - Ander Biguri
1个回答

21

我建议采取以下方法:

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

第一阶段(皮肤检测)的结果:

skin detection

最终结果:

final result

评论:

  1. 阶段1的计算使用以下算法
  2. 区域生长函数可以在此处下载
  3. 解决方案并不完美。例如,如果衬衫的纹理与背景的纹理相似,则可能失败。但我认为这是一个很好的开始。
  4. 可以进行另一个改进,即使用更好的区域生长算法,该算法不会扩展到skinMask位置。此外,可以基于第一次调用区域生长的结果来基于第二次调用的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接