我需要编写 webapp,用户将能够根据图像颜色执行搜索。我的问题是如何存储颜色数据?我认为最好的解决方案是减少图像颜色并为每个 r、g 和 b 通道准备直方图,但我不知道如何设计数据库。我想使用 MySQL DBMS。有人能指出我正确的方向吗?
问候
对于存储直方图数据,我想到了几个想法。显而易见的选择是有一个表(或三个用于单独的 R/G/B 通道)来表示(标准化)直方图,每个 bin 有一列。如果您使用 24 位颜色(8 位/通道),您可以将每个通道分成 16 个箱([0-15]、...、[240-255]),并在每列中存储像素的百分比掉进那个箱子里。
像这样的东西:
id imgID R_0_15 ... R_240_255 G_0_15 ... G_240_255 B_0_15 ... B_240_255
1 1234 0.1 0.23 0.023 0.234 0.11 0.01
通过这种设计,每个图像的整个(标准化)直方图将在表中表示为单行。
查询会有点挑战性——您必须动态生成它们,以便为感兴趣的值范围插入正确的列名。
也许更好的方法是 HistogramBins 表,其中每个图像和每个 bin 都有一个行条目:
id imgID component bin_min bin_max percentage
1 1234 R 0 15 0.1
....omitted rows...
1 1234 R 240 255 0.23
...etc...
使用这种存储格式,可以准备查询而不是动态计算。我不清楚这些组件是否应该像我一样分解,或者您是否应该为所有三种颜色组件的“bin 1”存储一行。我可能想写一些查询,看看什么最适合您的应用程序。
另外,我一直说“规范化”的原因是这种方案将使您的分箱与图像大小无关。
希望这有助于您入门。让我们知道你最终会得到什么!
RGB值对人类的感知没有意义,但它们可以很容易地转换为对人们更敏感的色相、饱和度、亮度。不幸的是,饱和度和亮度非常直观:更丰富:更淡,更亮:更深,但我们没有自然的颜色顺序,因此色调表示为围绕圆的任意度数。在实践中,要求人们做出精细的色调辨别,尤其是在寻找尚未看到的东西时是相当困难的。因此,您可能希望将类别限制为图 "a"中六边形的顶点。
那么你会遇到一个问题,一张照片的代表色是什么?一半蓝天和一半棕褐色沙子的图像是蓝色还是棕褐色?你在选择一种主导色调吗?您可能想要应用一个巨大的高斯模糊,然后平均产生的色调。您可能需要进一步完善您的问题和目标。
即使是 HSL 也有其描述性限制。我在上面提到“棕褐色”作为沙子的颜色。大多数读者可能对它的感知或命名完全没有问题,但除非你有太多使用颜色的经验,否则棕褐色的色调是橙色但苍白(饱和度较低)和明亮(更高的价值)是相当不明显的。大约三分之一的色相圈专门用于绿色等。