我有两张图片——有和没有衣服的人体模型。
请参考下面的示例图片。忽略人体模型上的珠宝、鞋类,想象第二个人体模型只有衣服。
我只想从这两个图像中提取服装以进行进一步处理。
复杂之处在于拍摄两张照片时相机的位置有轻微的位移。由于这种简单的减法生成服装面具是行不通的。
谁能告诉我如何处理?
我想我需要在两个图像之间进行注册,以便我只能从图像中提取服装?
非常感谢对博客、文章和代码的任何引用。
- 谢谢
我有两张图片——有和没有衣服的人体模型。
请参考下面的示例图片。忽略人体模型上的珠宝、鞋类,想象第二个人体模型只有衣服。
我只想从这两个图像中提取服装以进行进一步处理。
复杂之处在于拍摄两张照片时相机的位置有轻微的位移。由于这种简单的减法生成服装面具是行不通的。
谁能告诉我如何处理?
我想我需要在两个图像之间进行注册,以便我只能从图像中提取服装?
非常感谢对博客、文章和代码的任何引用。
- 谢谢
这是一个关于如何做到的想法,我没有测试过,但我的直觉告诉我它可能会起作用。我假设人体模型的姿势和相机的姿势会略有不同。
让原来的形象是A
,衣服的形象是B
。
取差值D = |A - B|
,应用一个中值滤波器,该滤波器与您预期的姿势和相机姿态误差的最大偏差成正比:Dmedian = Median(D, kernelsize)
。
使用适当的阈值量化Dmedian
成二进制掩码以获得服装的近似掩码(由于中值滤波器,这将小于服装本身)。通过将像素设置为 0 来拒绝任何面积过小的形状。Dmask = Q(Dmedian, threshold)
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
。
由于您的图像具有漂亮且连续的色板,因此两个相似图像之间的差异将是细线和小渐变,其中姿势和相机姿态不同。当在足够大的内核上对差异图像进行中值滤波时,这些线将被移除,因为它们位于少数像素中。
另一方面,这件衣服(希望)与未穿衣服的颜色有显着差异。并且会产生更大的差异。在中值过滤器之后对差异进行阈值化应该会给你一个粗略的服装遮罩,由于边缘上的一些像素由于它们的中值太低而被拒绝,所以该遮罩尺寸过小。如果近似值对您来说足够好,您可以在这里停下来。
通过扩展我们上面获得的掩码,我们得到了“真实”边缘的可能区域。上述过程大大缩小了我们对真实边缘的搜索区域,我们可以在沿着该边缘的图像之间应用更昂贵的相关搜索来找到服装的位置。高相关性意味着没有服装,低相关性意味着服装。
我们使用反向相关作为 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
wheresubregion
选择size
位置为 的像素周围的大小区域px_pos
。你可以看到,如果Ap == Bp
那时Cxy=1