基本上设置很简单 - RGB立方体中有一组点(每个轴上有0到255个整数值)。您必须以下列方式将这些点替换为另一个点:
我知道有许多颜色量化算法可以使用不同的效率,但它们主要是针对将颜色减少到一定数量,而不是“在不违反这些限制的情况下最小化”。
另外,我希望算法能够产生真正的绝对最小,而不仅仅是“非常接近最小”。
这是否可以在没有耗费时间全部搜索所有组合的情况下实现(对于任何实际图片都不可行)?我的直觉告诉我,这是NP完全问题或者更糟,但我无法证明这一点。
奖金设置:将常数R,G,B的限制更改为函数F(R source ,G source ,B < sub> source ,R target ,G target ,B target )如果映射没有问题则返回TRUE,并且为FALSE如果它超出范围。
答案 0 :(得分:2)
鉴于您的定义,图片的结构(即像素的组织方式)根本无关紧要,唯一重要的是RGB三元组的子集在图片中至少出现一次作为像素值。让该子集为S.你想找到另一个RGB三元组E的子集(编码),使得对于S中的每个s,在E中存在对应的e,使得diff(s,e)<=阈值,其中阈值是你对可接受的差异施加的限制和差异(...)将三联体距离减少为一个数字。 此外,您希望找到尺寸最小的E,即任何E's.t. | E'|&lt; | E |,至少有一个(s,e)对违反差异约束。
这个特殊问题不能给出渐近复杂度评估,因为它只有一组有限的实例。它可以通过预先计算每个子集S的最小集合E在恒定时间(理论上)求解。有大量的子集S但是只有有限数量,所以问题不能是例如归类为NP完全优化问题或任何事情。 算法对这个问题的实际运行时间因此完全取决于您愿意容忍的预处理量。为了获得渐近复杂性评估,您需要首先概括问题,以便问题实例集严格无限。
答案 1 :(得分:1)
最佳量化是一个NP难问题(Son H. Nguyen,Andrzej Skowron - Quantization Of Real Value Attributes,1995)。
如果您的点的簇大于您的球体,但点之间的距离小于球半径,则预定义的最大距离不会使事情变得更容易 - 那么您有很多的组合(因为每个球体放置的选择可能取代所有其他球体)。不幸的是,这种情况经常发生在带有渐变的真实图像上(整个直方图都是一个巨大的聚类并不罕见)。
您可以修改许多量化算法以选择群集数量,直到满足某些质量,例如在Median Cut和Linde-Buzo-Gray中,您可以在达到质量限制时停止细分空间。它不能保证它是全局最小值(即NP难度),但在LBG中你至少知道你在当地最小值。
答案 2 :(得分:0)
这是一个关于我如何做到这一点的想法 - 不幸的是,这可能需要大量内存并且非常慢:
您创建一个256x256x256立方数据结构,其中包含一个计数器和一个“邻居”颜色列表。对于在图像中找到的每种独特颜色,您可以增加每个单元格的计数器,该计数器位于围绕该颜色的球体半径范围内。球体的半径是您最初定义的最大可接受距离。您还可以将颜色添加到每个单元格的邻居列表中。
添加完所有独特颜色后,您将遍历多维数据集并找到具有最大计数器值的单元格。将此颜色添加到结果列表中。现在再次遍历您的立方体并从所有单元格中删除此颜色和该颜色的邻居列表中的所有颜色,并在删除颜色时减少每个单元格的计数器。然后重复搜索最大计数器并移除,直到立方体中不再有颜色。
或者,如果在图像中更频繁地出现,也可以多次添加相同的颜色。不确定这是否会改善视觉效果。