5

我需要编写 webapp,用户将能够根据图像颜色执行搜索。我的问题是如何存储颜色数据?我认为最好的解决方案是减少图像颜色并为每个 r、g 和 b 通道准备直方图,但我不知道如何设计数据库。我想使用 MySQL DBMS。有人能指出我正确的方向吗?

问候

4

2 回答 2

4

对于存储直方图数据,我想到了几个想法。显而易见的选择是有一个表(或三个用于单独的 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”存储一行。我可能想写一些查询,看看什么最适合您的应用程序。

另外,我一直说“规范化”的原因是这种方案将使您的分箱与图像大小无关。

希望这有助于您入门。让我们知道你最终会得到什么!

于 2010-09-16T01:28:09.400 回答
2

RGB值对人类的感知没有意义,但它们可以很容易地转换为对人们更敏感的色相、饱和度、亮度。不幸的是,饱和度和亮度非常直观:更丰富:更淡,更亮:更深,但我们没有自然的颜色顺序,因此色调表示为围绕圆的任意度数。在实践中,要求人们做出精细的色调辨别,尤其是在寻找尚未看到的东西时是相当困难的。因此,您可能希望将类别限制为图 "a"中六边形的顶点。

那么你会遇到一个问题,一张照片的代表色是什么?一半蓝天和一半棕褐色沙子的图像是蓝色还是棕褐色?你在选择一种主导色调吗?您可能想要应用一个巨大的高斯模糊,然后平均产生的色调。您可能需要进一步完善您的问题和目标。

对感知模型的空闲思考

即使是 HSL 也有其描述性限制。我在上面提到“棕褐色”作为沙子的颜色。大多数读者可能对它的感知或命名完全没有问题,但除非你有太多使用颜色的经验,否则棕褐色的色调是橙色但苍白(饱和度较低)和明亮(更高的价值)是相当不明显的。大约三分之一的色相圈专门用于绿色等。

于 2010-09-16T01:32:43.610 回答