OpenCV:使用 Trimap 图像

Ros*_*sFe 3 c++ opencv image-processing image-segmentation

我找到了这个狗和猫的图像数据集:The Oxford-IIIT Pet Dataset。每个图像都有一个像素级的前景-背景分割(trimap)图像。

网上查了一下,trimap是三种颜色的图片(一种用于背景,一种用于前景,一种用于未分类区域),但这里的图像是全黑的。

这是错误还是正确?但最重要的是,我想知道您是否以及如何使用它来获取给定正常图像的黑色背景上的猫或狗的新图像。

谢谢。

Mar*_*ell 6

Trimaps 看起来是黑色的,因为它们只包含 0-2 范围内 0-255 的像素值,其中:

  • 1 表示“宠物”
  • 2 表示“背景”
  • 3 表示“边界”

查看文本形式的像素:

identify -verbose Abyssinian_1trimap.png  | more
Run Code Online (Sandbox Code Playgroud)

输出

  Histogram:
     22938: (  1,  1,  1) #010101 gray(1)
    198766: (  2,  2,  2) #020202 gray(2)
     18296: (  3,  3,  3) #030303 gray(3)
Run Code Online (Sandbox Code Playgroud)

如果您对比拉伸三边形,您可以看得更清楚。我在Abyssinian1这里使用图像:

convert Abyssinian_1trimap.png -auto-level trimap.jpg
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您1将 Trimap 中的所有像素设为白色,将所有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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您想要边框和宠物,请执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您还可以尝试模糊蒙版以柔化边缘:

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

抱歉,我是用ImageMagick做的,因为我觉得这更容易,而且它安装在大多数 Linux 发行版上,可用于 macOS 和 Windows。OpenCV 的原理是一样的。