首页 > 解决方案 > 图像色彩的数学计算(色彩理论)

问题描述

我最近测试了David Haslera 和 Sabine Susstrunk用 Python 实现的以下算法来确定图像的“色彩” 。然而,我注意到这个算法在一些测试图像上的表现很有趣。

单个红色、绿色和蓝色像素的 3x1、每通道 8 位 RGB 图像的色彩度指标似乎尽可能高(请随意证明我错了,这只是我观察到的) .

这就是我的意思。此图像的色度为 206.52:

在此处输入图像描述

而这个 4x4 图像的色彩是 185.13:

在此处输入图像描述

而纯黑白图像的彩色度为 0,用于比较。(这些值是在每个通道的电平存储为 0 到 255 之间的整数时计算的,包括 0 和 255)。

直觉上,我认为第二张图像比第一张更“多彩”,但这不是该算法给出的结果。

本质上,我正在寻找与图像中出现的颜色变化相对应的其他测量值。但是,我不确定这在数学上会是什么样子,尤其是因为图像被表示为不同的红色、蓝色和绿色通道。

一个想法可能是简单地记录图像中不同像素的数量(每次看到一个新颜色的像素时,在计数中添加一个),但是当有很多暗像素(但不同)几乎无法区分的像素。如果有很多几乎相同颜色的略有不同的像素,它也不会做得很好。然而,在测试像这样的极端情况时,那篇论文中的算法似乎打破了我的直觉。

有人知道其他指标可以更准确地表示图像中出现的各种颜色吗?或者你可以自己提议一个吗? 我对任何想法都持开放态度。

标签: pythonimageimage-processingstatisticscolor-theory

解决方案


我的建议(不是来自任何权威)是将图像转换为 HSV,然后在一组不规则的 bin 上构建直方图。一个简单的方案是

  1. 三个灰色箱(s <1/3):“黑色”(v <1/3)、“灰色”(v <2/3)和“白色”</li>
  2. 六个色调箱(s <2/3):对于三种原色(h的三分之一)、“色调”(v >1/2)和“阴影”中的每一种</li>
  3. 十二个纯色箱:六种色调中的每一种都具有相同的v区别

这非常近似于颜色之间的感知距离;通过调整各个细分的数量,可以轻松获得其他数量的垃圾箱。

对直方图进行归一化以获得经验离散概率分布;计算其并通过除以理论最大值(  N个 bin 的 log N )进行归一化。每个 bin 中像素数相同的图像将获得 1 分;任何纯色都将得分为 0。

当然也有病态的情况,例如仅包含两个不同像素值的图像,这些像素值恰好位于 bin 之间的边界上。这样的图像将得分 log 2/log  N,并且这个想法可以扩展到在共享角落相遇的 8 个 bin。向图像(或与原始图像合并的副本)添加少量噪声可能是值得的,以减少此类异常的可能性。

要考虑全红色图像(稍微)比全灰色图像更彩色,您可以在直方图中引入灰色“测试模式”(并调整熵的归一化以考虑增加的最小值和减少的最大值)。测试图案的大小应与图像相当。


推荐阅读