- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两张图片——人体模特有和没有服装。
请引用下面的示例图片。忽略人体模型上的珠宝、鞋类,想象第二个人体模型只有衣服。
我想从两张图片中仅提取服装以进行进一步处理。
复杂的是,拍摄两张照片时,相机的位置有轻微的位移。由于这种简单的减法生成服装 mask 是行不通的。
谁能告诉我怎么处理?
我想我需要在两幅图像之间进行配准,这样我才能从图像中只提取服装?
非常感谢任何对博客、文章和代码的引用。
--谢谢
最佳答案
这是您如何做到这一点的想法,我还没有测试过,但我的直觉告诉我它可能会奏效。我假设人体模型的姿势和相机姿态会略有不同。
设原图为A
,穿衣图为B
。
取差值 D = |A - B|
,应用中值滤波器,该滤波器与您期望的姿势和相机姿态误差的最大偏差成正比:Dmedian = Median(D,内核大小)
。
将 Dmedian
量化为二进制掩码 Dmask = Q(Dmedian, threshold)
使用适当的阈值以获得服装的近似 掩码(由于中值滤波器,这将小于服装本身)。通过将像素设置为 0,拒绝 Dmedian
中面积太小的任何形状。
将 Dmask
中的形状与中值内核的大小成比例地扩展到 Emask=expand(Dmask, k*kernelsize)
中。然后构造掩码 Fmask=|Dmask - Emask|
的差异,它现在包含服装边缘预期所在的像素区域。对于该区域中 Fmask
中的每个像素,使用一个小的函数找到 A
和 B
之间的相关性 Cxy
邻域,将相关性存储到图像中 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
其中 subregion
在位置为 px_pos
的像素周围选择大小为 size
的区域。你可以看到如果 Ap == Bp
那么 Cxy=1
关于matlab - 人体模特的服装剪裁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961551/
我是一名优秀的程序员,十分优秀!