如何使用imread读取/理解PNG图像中的透明色?

时间:2016-01-30 20:54:35

标签: python image numpy colors anaconda

这是我的代码(使用带有scikit-image的Anaconda):

from skimage.io import imread
image = imread('myimage.png')

但是我想知道调色板中的哪一个是透明色,并且能够像那样对待它。这意味着:最终加载图像时,尽管来自(W, H, 3)的信息如下,但其形状为pnginfo为RGB:

  

Bitdepth(Bits / Sample):8
  频道(样本/像素):1
  像素深度(像素深度):8
  颜色类型(光度解释):带有alpha的PALETTED COLOR(44种颜色,1种透明)

我想要三分之一:

  • 当加载图像时,由于我将其作为RGB数组,我想知道哪种颜色(在此上下文中我需要颜色作为其RGB组件)是透明的。
  • 获取一个掩码(实际上是一个WxH布尔数组),告诉我哪些像素是透明的,哪些像素是不透明的。
  • 将图像加载为RGBA数组而不是RGB数组。

我该怎么办?

我正在使用Anaconda,它有类似的东西:

  • numpy的
  • SciPy的

2 个答案:

答案 0 :(得分:0)

skimage.io.imread方法默认使用Pillow(因为没有传递插件参数,Pillow是调用imread等函数时的第一个首选插件),但是插件在skimage.io.imread中没有像其他插件那样使用mode参数。部分源代码证明了这种缺乏支持的原因是:

# This chunk of code belongs to the plugin implementation of imread.
im = Image.open(fname)
try:
    # this will raise an IOError if the file is not readable
    im.getdata()[0]
except IOError:
    site = "http://pillow.readthedocs.org/en/latest/installation.html#external-libraries"
    raise ValueError('Could not load "%s"\nPlease see documentation at: %s' % (fname, site))
else:
    return pil_to_ndarray(im, dtype=dtype, img_num=img_num)

不是调用skimage.io.read,而是在另一个包中有一个函数(scipy.ndimage.imread,如果你有scikit-image),它也会执行所需的技巧:

from scipy.ndimage import imread
rgba = imread('myimage.png', mode='RGBA')

答案 1 :(得分:0)

所以 scipy 已经弃用了 imread,python 说要使用 matplotlib 的 plt.imread()。 我环顾四周,发现这个例子通过删除定义白色的列来创建透明图像 代码在这里: https://www.geeksforgeeks.org/how-to-make-background-image-transparent-using-python/

from PIL import Image
  
def convertImage(image=image):
    image = Image.open(image)
    image = image.convert("RGBA")
  
    data = image.getdata()
  
    newData = []
  
    for item in data:
        if item[0] == 255 and item[1] == 255 and item[2] == 255:
            newData.append((255, 255, 255, 0))
        else:
            newData.append(item)
  
    image.putdata(newData)
    image.save('newimage.png', "PNG")
    
#  
convertImage('apple.jpg')

如您所见,它并不完美,但这取决于您需要的分辨率。 Image of apple