我有两张图片——带有 的人体模型 和没有 服装的 。
请引用下面的示例图片。忽略人体模型上的珠宝、鞋类,想象第二个人体模型只有 衣服 。
我想 从两个图像中仅提取 服装 以进行进一步处理。
复杂的是在拍摄两张照片时,相机位置有轻微位移。由于这种简单的减法生成服装 mask 将不起作用。
谁能告诉我如何处理?
我想我需要在两个图像之间进行 注册 以便我只能从图像中提取服装?
非常感谢对博客、文章和代码的任何引用。
——
谢谢
最佳答案
主意
这是关于如何做到这一点的想法,我还没有测试过,但我的直觉告诉我它可能会奏效。我假设人体模型的姿势和相机的姿态会略有不同。
让原始图像为 A
,衣服图像为 B
。
取差异 D = |A - B|
,应用与您期望的姿势和相机姿态误差的最大偏差成正比的中值滤波器: Dmedian = Median(D, kernelsize)
。
使用适当的阈值将 Dmedian
量化为二进制掩码 Dmask = Q(Dmedian, threshold)
以获得服装的 近似 掩码(由于中值滤波器,这将小于服装本身)。通过将像素设置为 0 来拒绝 Dmedian
中任何面积太小的形状。
将 Dmask
中的形状与中值内核的大小成比例地扩展为 Emask=expand(Dmask, k*kernelsize)
。然后构建掩码 Fmask=|Dmask - Emask|
中的差异,它现在包含预期服装边缘所在的像素区域。对于该区域内 Fmask
中的每个像素,使用小邻域找到 Cxy
和 A
之间的相关性 B
,将相关性存储到图像 C=1.0 - Corr(A,B, Fmask, n)
中。
您的最终服装掩码将是 M=C+Dmask
。
解释
由于您的图像具有漂亮且连续的色块,因此两个相似图像之间的差异将是细线和小渐变,其中姿势和相机姿态不同。当在足够大的内核上对差异图像进行中值滤波器时,这些线将被删除,因为它们位于少数像素中。
另一方面,这件衣服(希望)与未穿衣服的颜色有显着差异。并且会产生更大的差异。在中值滤波器之后对差异进行阈值处理应该会给你一个粗略的服装面具,由于边缘上的一些像素由于它们的中值太低而被拒绝。如果近似值对你来说足够好,你可以停在这里。
通过扩展我们上面获得的掩码,我们得到了“真实”边缘的可能区域。上述过程已经大大缩小了我们对真实边缘的搜索区域,我们可以在沿着这条边缘的图像之间应用更昂贵的相关搜索来找到服装的位置。高相关性意味着没有carment,低相关性意味着服装。
我们使用反向相关作为 alpha 值与最初较小的掩码一起获得可用于提取服装的 alpha 值掩码。
澄清
扩展:我所说的“扩展蒙版”的意思是找到蒙版区域的轮廓并对其进行设置/增长/放大以使其更大。Corr(A,B,Fmask,n)
:只是一个任意选择的相关函数,它给出了 A
和 B
中像素之间的相关性,这些像素是使用 Fmask
大小的区域由掩码 n
选择的。对于每个测试的像素,该函数返回 1.0
用于完美匹配和 0.0
用于反匹配。一个很好的函数是这个伪代码:
foreach px_pos in Fmask where Fmask[px_pos] == 1
Ap = subregion(A, px_pos, size) - mean(mean(A));
Bp = subregion(B, px_pos, size) - mean(mean(B))
Cxy = sum(sum(Ap .* Bp))*sum(sum(Ap .* Bp)) / (sum(sum(Ap.*Ap))*sum(sum(Bp.*Bp)))
C[px_pos] = 1.0 - Cxy;
end
其中
subregion
在位置为 size
的像素周围选择大小为 px_pos
的区域。你可以看到如果
Ap == Bp
那么 Cxy=1