【问题标题】:OpenCV : Using a Trimap imageOpenCV:使用 Trimap 图像
【发布时间】:2017-06-06 06:27:23
【问题描述】:

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

在网上搜索,我看到trimap是一张有三种颜色的图像(一种用于背景,一种用于前景,一种用于未分类区域),但这里的图像全是黑色的。

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

谢谢。

【问题讨论】:

    标签: c++ opencv image-processing image-segmentation


    【解决方案1】:

    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 的原理是一样的。

    【讨论】:

    • 谢谢。我应该如何更改您的最后一个命令以在边框(像素 3)中扩展图像?
    • 对不起,你什么意思?
    • 我希望猫的图像更精致,好像我只想从原始图像中删除背景。只有 trimap 的灰色部分(如上所示)在最终图像中变为黑色(而不是 trimap 的灰色和白色部分)。
    【解决方案2】:

    我也为此苦苦挣扎了一阵子,直到我终于弄明白了。要在 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 )
    

    【讨论】:

    • 对于 TF 2,您需要将 tf.gfile 更改为 tf.io.gfile。对于 macOS,您需要添加 plt.show()。否则它可以工作:) 感谢分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2015-04-05
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多