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 )
我找到了这个猫狗图像数据集: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 )