OpenCV:使用 Trimap 图像

OpenCV : Using a Trimap image

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

在网上搜了一下,看到trimap是一张三色的图(背景一种,前景一种,未分类区域一种),但是这里全黑了。

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

谢谢。

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

  • 1 表示 "pet"
  • 2 表示 "background"
  • 3 表示 "border"

查看文本形式的像素:

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)

如果对比拉伸 trimaps,您会看得更清楚。我在这里使用 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一样。

我也为此苦苦挣扎了一段时间,直到我终于弄明白了 out.To 在 Python 中加载并显示这些文件,你需要这个

import io
import os
import tensorflow as tf
import PIL
import matplotlib.pyplot as plt
import numpy as np

with tf.gfile.GFile("Abyssinian_1.png", 'rb') as fid:
    encoded_mask_png = fid.read()
encoded_png_io = io.BytesIO(encoded_mask_png)
mask = PIL.Image.open(encoded_png_io)            
plt.imshow( np.array(mask) / 2 * 255 )