PIL:如何获得RGB的调色板索引?

2024-10-01 07:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想迭代PNG图像(我用创建)中给定颜色的所有像素。我可以处理迭代部分,但该图像使用调色板,因此我需要获取给定颜色的调色板索引,在我的例子中为白色。通常这应该与函数ImagePalette.getcolor()一起工作,但这告诉我调色板处于原始模式,我不知道如何禁用。我所做的如下,但必须有一个更简单的方法

        import sys
        from PIL import Image
        import numpy as np

        image = Image.open( sys.argv[1] )
        width, height = image.size
        # image.palette.getcolor( (255,255,255) ) # gives ValueError: palette contains raw palette data
        palette = image.getpalette() # a list
        palette = np.reshape( palette, (-1, 3) )
        #rows255, _cols255 = np.where( palette == (255,255,255) ) # gives the same as below - apparently or'ing
        rows255, _cols255 = np.where( palette == 255 )
        whites = []
        count = 1
        prev = -1
        for r in rows255:
            if r==prev:
                count += 1
            else:
                count = 1
            if count==3:
                whites.append( prev )
            prev = r

        print(whites)

所以我对直接使用或者正确地使用numpy.where()来处理元组感兴趣

使用调色板的每个图像的情况都应该相同,但这是我的一个文件:https://imgur.com/ojul9mf


Tags: 图像imageimport颜色countnpsyswhere
1条回答
网友
1楼 · 发布于 2024-10-01 07:15:45

我不确定你的问题到底是什么,也不确定你想做什么。我认为您需要获得与白色对应的调色板项的索引

# Open image
image = Image.open('image.png')

# Extract palette and reshape to 256x3 RGB entries
palette = image.getpalette()
palette = np.reshape( palette, (-1, 3) )

这将告诉您哪些调色板条目是白色的,即第一个和最后一个:

np.all(palette==255,axis=-1)

Out[34]: 
array([ True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False,  True])

或者你想要这个,它告诉你同样的事情,即第一个和最后一个条目是白色的:

np.where(np.all(palette==255,axis=-1)) 

Out[35]: (array([  0, 255]),)

相关问题 更多 >