python - Python比较图像的彩色区域
问题描述
假设图像中只有 2 种颜色。在 Python 中,最简单的方法是告诉图像这两种颜色的(彩色区域)比另一种(相似图像组)多?
“多”的定义:一张图片的总色块面积,大于另一张。(请注意颜色的形状可能不规则)
谢谢你。
解决方案
好的,经过一些实验,我有一个可能的解决方案。您可以使用 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
图像上尝试了这个,就像你指定的那样。希望这可以帮助!
推荐阅读
- python-3.x - 创建一对连续的时间列表
- php - Laravel 部署:PHP 错误无法加载动态库“pdo_pgsql”
- vuejs2 - 从数据库读取数组后如何触发手表?
- axapta - 对象引用未设置为对象实例,订单未同步到 ERP。有人知道这个问题吗?
- ios - 当应用程序在使用 expo 的 react-native 的后台(关闭)中收到通知时,如何处理应用程序图标徽章计数?(IOS)
- xml - 了解 schematron 验证
- matplotlib - 带有 siunitx 的 Matplotlib 中的 Helvetica
- kubernetes-helm - 当我们删除现有的舵图并尝试再次安装时,Mysql 舵图不起作用
- javascript - 使用 JavaScript 的 Kendo UI 自动完成和多选服务器端过滤器设置值
- ios - 仅在收到第一条消息后如何应用组合运算符?