trimaps 看起来是黑色的,因为它们只包含 0-2 范围内的像素值,范围为 0-255,其中:
- 1 表示“宠物”
- 2 表示“背景”
- 3 表示“边界”
以文本形式查看像素:
identify -verbose Abyssinian_1trimap.png | more
输出
Histogram:
22938: ( 1, 1, 1) #010101 gray(1)
198766: ( 2, 2, 2) #020202 gray(2)
18296: ( 3, 3, 3) #030303 gray(3)
如果您对比拉伸三元图,您可以看得更清楚。我在这里使用Abyssinian1 图片:
convert Abyssinian_1trimap.png -auto-level trimap.jpg
如果您将 trimap 中的所有1 像素设为白色,将所有2 像素设为黑色,将所有3 像素设为白色,并使用darken 混合将其与实际照片混合,您将得到什么你想要的:
convert Abyssinian_1.jpg \( Abyssinian_1trimap.png -fill white -opaque "rgb(1,1,1)" -opaque "rgb(3,3,3)" -fill black -opaque "rgb(2,2,2)" \) -compose darken -composite pet.png
如果您想要边框和宠物,请执行以下操作:
convert Abyssinian_1.jpg \( Abyssinian_1trimap.png -fill white -opaque "rgb(1,1,1)" -opaque "rgb(3,3,3)" -fill black -opaque "rgb(2,2,2)" \) -compose darken -composite pet.png
您还可以尝试模糊蒙版以柔化边缘:
convert Abyssinian_1.jpg \( Abyssinian_1trimap.png -fill white -opaque "rgb(1,1,1)" -fill black -opaque "rgb(3,3,3)" -opaque "rgb(2,2,2)" -blur 0x8 \) -compose darken -composite pet.png
抱歉,我是用 ImageMagick 做的,因为我发现它更容易安装在大多数 Linux 发行版上,并且可用于 macOS 和 Windows。 OpenCV 的原理是一样的。