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

Python 如何使用imread读取/理解PNG图像中的透明颜色?,python,image,numpy,colors,anaconda,Python,Image,Numpy,Colors,Anaconda,这是我的代码(使用带有scikit图像的Anaconda): 但是我想知道调色板中哪一种是透明的颜色,并且能够这样对待它。这意味着:当图像最终加载时,它的形状(W,H,3)为RGB,尽管来自pnginfo的信息如下所示: 位深度(位/样本):8 通道(样本/像素):1 像素深度(像素深度):8 颜色类型(光度解释):带alpha的浅灰色(44种颜色,1种透明) 我想要三分之一: 在加载图像时,由于我将其作为RGB阵列获取,因此我想知道哪种颜色(在本文中,我需要该颜色作为其RGB组件)是透明的

这是我的代码(使用带有scikit图像的Anaconda):

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

位深度(位/样本):8
通道(样本/像素):1
像素深度(像素深度):8
颜色类型(光度解释):带alpha的浅灰色(44种颜色,1种透明)

我想要三分之一:

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

我使用的是水蟒,它有如下功能:

  • 枕头
  • 努比
  • 松软的

默认情况下,
skimage.io.imread
方法使用
Pillow
(因为没有传递任何插件参数,在调用imread等函数时,Pillow是首选插件),但是
skimage.io.imread
中的插件不像其他插件那样使用
模式
参数。证明缺乏支持的部分源代码如下:

# 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')

因此,scipy对imread进行了删减,python说要使用matplotlib的plt.imread()。 我环顾四周,发现这个示例通过删除定义白色的列来创建透明图像 代码如下:

正如你所见,这并不完美,但这取决于你需要的解决方案。

imread
是python映像库的包装器。如果将图像的模式作为命名参数传递,它可能会起作用
imread('myimage.png',mode='RGBA')
这种执行返回值的形状仍然具有
。形状==(H,W,3)
而不是4您可以尝试<代码>从PIL导入图像;Image.open('myimage.png').split()这将返回四个通道的RGBA。找到了使用其他插件的解决方案。如果图像已经是RGBA,则可以使用
Image.open
-方法。您应该将您的解决方案作为答案发布并接受它,以防以后其他人遇到同样的问题。
from scipy.ndimage import imread
rgba = imread('myimage.png', mode='RGBA')
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')