使用 Python 和 Pillow,我们如何计算 PNG 或 JPG 图像中唯一颜色的数量?
Using Python and Pillow, how can we count the number of unique colors in a PNG or JPG image?
我正在使用 Pillow 进行一些图像操作,并想计算 PNG 或 JPG 图像文件中有多少种独特的颜色。我可以使用具有少量颜色的模式 "P" 图像轻松做到这一点,但它不适用于 RGB 或 RGBA 图像。阅读 Pillow 的文档,似乎 Image.getcolors()
returns None
如果有超过 256 种颜色。
最好的方法是什么?我们可以用 Pillow 来做吗?我的目标是纯 Python + Pillow,但我可以选择在我的依赖项列表中包含 numpy,如果它有帮助的话。
是否可以列出像素 RGB 并扫描它?正如 John Anderson 所说,您可以使用 Image.getcolors 来获取它。但是要获得唯一变量的数量,您可以将其转换为一个集合,删除重复项,然后获取其长度,其中 len(set(list))
.
一种可能的解决方案(我在 Base64 中对 PNG 图像进行了编码):
from PIL import Image
from io import BytesIO
import base64
data = '''iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+ACCAAXMEa+fpcAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAx9JREFUeNrt3MtNA1EMQFGMpqWIgpAiakJKA6mBBrJOL2wfBYQVDrI9c85+8pnPlWfxXrxQbSWPD6eQv3p1CkAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEAurKWPC+1nv/z/S315efLzT2ICQAQAEAAAAEABAAQAEAAAAEABAAEABAAQAAAAQAEABAAYH+sxc4r3Q8g6+vju/T7r6e7e9gEAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIADAo236H1jJ45+wmDz1EefLbfR+ApgAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAD4F5tTcGzX0736J4SrYAIABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAOBB+X4AK3l85D+C2bdAtdH7GZgAwCsAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIABAWx3WMq+yg12A2Rd/H9ev9BYwAYBXAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAgLaesRb50Ov5ofgBTH2ECQC8AgACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACALS1OQWMtop3lIgYffpMAOAVABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAoC37ATBbdj1+9X4CJgBAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAH5nPwCOLbufgAkAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAKBKNPgNq+xgqH+ASp9BEwB4BQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEAGgrdvAf7CdA5QMw+hkyAYBXAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAgLbCKbAlgGfABAAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAQDs/+5skuT18qwIAAAAASUVORK5CYII='''
img = Image.open(BytesIO(base64.b64decode(data)))
unique_colors = set()
for i in range(img.size[0]):
for j in range(img.size[1]):
pixel = img.getpixel((i, j))
unique_colors.add(pixel)
print('Image info = ', img)
print('Unique color count = ', len(unique_colors))
打印:
Image info = <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=256x256 at 0x7FFFF670A400>
Unique color count = 7
我正在使用 Pillow 进行一些图像操作,并想计算 PNG 或 JPG 图像文件中有多少种独特的颜色。我可以使用具有少量颜色的模式 "P" 图像轻松做到这一点,但它不适用于 RGB 或 RGBA 图像。阅读 Pillow 的文档,似乎 Image.getcolors()
returns None
如果有超过 256 种颜色。
最好的方法是什么?我们可以用 Pillow 来做吗?我的目标是纯 Python + Pillow,但我可以选择在我的依赖项列表中包含 numpy,如果它有帮助的话。
是否可以列出像素 RGB 并扫描它?正如 John Anderson 所说,您可以使用 Image.getcolors 来获取它。但是要获得唯一变量的数量,您可以将其转换为一个集合,删除重复项,然后获取其长度,其中 len(set(list))
.
一种可能的解决方案(我在 Base64 中对 PNG 图像进行了编码):
from PIL import Image
from io import BytesIO
import base64
data = '''iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+ACCAAXMEa+fpcAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAx9JREFUeNrt3MtNA1EMQFGMpqWIgpAiakJKA6mBBrJOL2wfBYQVDrI9c85+8pnPlWfxXrxQbSWPD6eQv3p1CkAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEAurKWPC+1nv/z/S315efLzT2ICQAQAEAAAAEABAAQAEAAAAEABAAEABAAQAAAAQAEABAAYH+sxc4r3Q8g6+vju/T7r6e7e9gEAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIADAo236H1jJ45+wmDz1EefLbfR+ApgAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAD4F5tTcGzX0736J4SrYAIABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAOBB+X4AK3l85D+C2bdAtdH7GZgAwCsAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIABAWx3WMq+yg12A2Rd/H9ev9BYwAYBXAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAgLaesRb50Ov5ofgBTH2ECQC8AgACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACALS1OQWMtop3lIgYffpMAOAVABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAoC37ATBbdj1+9X4CJgBAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAH5nPwCOLbufgAkAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAKBKNPgNq+xgqH+ASp9BEwB4BQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEAGgrdvAf7CdA5QMw+hkyAYBXAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAgLbCKbAlgGfABAAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAQDs/+5skuT18qwIAAAAASUVORK5CYII='''
img = Image.open(BytesIO(base64.b64decode(data)))
unique_colors = set()
for i in range(img.size[0]):
for j in range(img.size[1]):
pixel = img.getpixel((i, j))
unique_colors.add(pixel)
print('Image info = ', img)
print('Unique color count = ', len(unique_colors))
打印:
Image info = <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=256x256 at 0x7FFFF670A400>
Unique color count = 7