首页 > 解决方案 > Python比较图像的彩色区域

问题描述

假设图像中只有 2 种颜色。在 Python 中,最简单的方法是告诉图像这两种颜色的(彩色区域)比另一种(相似图像组)多?

“多”的定义:一张图片的总色块面积,大于另一张。(请注意颜色的形状可能不规则)

谢谢你。

在此处输入图像描述

标签: pythonimage

解决方案


好的,经过一些实验,我有一个可能的解决方案。您可以使用 Pillow,一个常见的图像加载/处理库,将图像转换为 ndarray,然后使用该count_nonzero()方法获得您想要的结果。作为一个有趣的副作用,这适用于任意数量的颜色。这是我刚刚尝试过的完整工作代码:

from PIL import Image # because for some reason, that's how you import something from Pillow
import numpy as np

im = Image.open("/path/to/image.png")
arr = np.array(im.getdata())
unique_colors, counts = np.unique(arr.reshape(-1, arr.shape[1]), axis=0, return_counts=True)

现在该unique_colors变量保存图像中出现的唯一颜色,并counts保存图像中每种颜色的相应计数;也就是说,是任意一个在图像中出现counts[i]的次数。unique_colors[i]i

独特+重塑线是如何工作的?这是从这个特定的答案中借来的。基本上,您将图像数组展平,使其具有 shape (num_pixels, num_channels),这可能是 1、3 或 4,具体取决于您的图像格式(单通道、RGB、RGBA 等)。现在我有一个巨大的 2D 像素“表”,我只需找到哪些行值(因此axis=0)是唯一的,然后使用return_counts关键字返回,嗯,计数。

此时,您已经提取了单个图像的唯一颜色和这些颜色的计数。要比较多张图像,您可以在多张图像上重复此过程,找出它们共有的颜色,然后您可以简单地比较整数以找出哪个图像具有更多特定颜色。

对于我的特定图像,通道的格式恰好是 RGBA;无论如何,我建议arr.shape在重塑步骤之前打印出来,以验证您是否拥有正确的索引。如果您/其他人知道一种更通用的方法来查找以这种方式获得的图像的通道索引 - 我全神贯注。因此,您可能必须arr.shape根据您的图像将索引更改为其他内容。作为记录,我在.png图像上尝试了这个,就像你指定的那样。希望这可以帮助!


推荐阅读