我有一个需求,需要将一组样本颜色值与已知的颜色值进行匹配,以查找完全匹配或接受范围内的匹配。我不确定哪种算法最适合这个需求,希望能得到建议。
我考虑使用SQL查询,因为我认为这是一种简单明了的方法,但理想情况下,应该在应用服务器或甚至GPU上进行内存处理,以获得最大速度。
例如:假设我们有一组三个RGB颜色值,其中两个是蓝色,一个是橙色:
样本集:
颜色1:81,177,206(蓝色)
颜色2:36, 70, 224(蓝色)
颜色3:255, 132, 0(橙色)
必须将这组由3个颜色值组成的样本集与更大的颜色值集进行匹配,以查看是否存在完全匹配或任何模式匹配,其中颜色的RGB值变化在可接受的范围内。假设任何RGB组件的值都可以高于或低于3位数字。
假设我们要搜索的已知颜色值集如下:
考虑到这种情况,我们运行样本集时会发现零个匹配项,因为已知颜色中没有一个颜色的Color 1与我们的样本集数值接近。然而,让我们将另一种颜色添加到已知集合中,它将返回一个正匹配项:
如果在 Known Set 中存在以下 RGB 值的 Sample F,则会返回匹配结果,因为它与我们样本集中的 Color 1 的确切 RGB 值相同。此外,我们需要接受 RGB 值的差异程度,所以以下内容也将返回匹配结果,因为每个 RGB 值都与样本集中的 Color 1 的值相差不超过 3 位数字:
正匹配:(请记住,Color 1 是:81,177,206)
Sample F: 80,177,206(红色通道相差 1 位数字)
Sample F: 81,175,204(绿蓝通道相差 2 位数字)
Sample F: 82,179,208(三个通道均相差不超过 3 位数字)
然而,如果距离太大,则无法找到匹配项。任何 RGB 组件必须在 3 位数字内才能触发正匹配结果。因此,如果 Sample F 看起来像下面这样,我们将不会得到正匹配结果,因为距离太大:
负匹配:
Sample F: 85,177,206(红色通道相差 4 位数字)
Sample F: 81,170,206(绿色通道相差 7 位数字)
Sample F: 81,177,200(蓝色通道相差 6 位数字)
到目前为止,我们只考虑了样本集中的 Color 1。然而,要求考虑整个样本集。因此,如果无法找到颜色 1 的正匹配项,则我们假定没有匹配,并且不考虑样本集中的颜色 2 和 3。
但是,如果我们发现颜色 1 的正匹配结果,比如 80,177,206,它只在红色通道上与 81 相差 1 位数字,那么我们会继续处理颜色 2,如果我们找到了颜色 2 的正匹配结果,那么我们会处理颜色 3 等等。
您对此问题最适合的算法有何建议?我需要一些允许 Known Set 规模扩大而不会影响性能的东西。在实际应用中,Known Set 中可能会有超过 1 百万个样本。
我考虑使用哈希表,每个颜色一个哈希表来构建 Known Set。因此,我可以测试是否存在颜色 1 的匹配项,如果找到,则测试颜色 2 的哈希表,然后在找不到更多匹配项时停止。如果我在所有 3 个颜色/哈希表上都获得了正匹配结果,则说明总体匹配成功,否则就不会。然而,这种方法不允许在每个颜色的 RGB 通道中进行所需的差异。有太多的组合无法构建哈希表来存储所有可能性。
提前感谢您的回答,并感谢您阅读到这里!
我考虑使用SQL查询,因为我认为这是一种简单明了的方法,但理想情况下,应该在应用服务器或甚至GPU上进行内存处理,以获得最大速度。
例如:假设我们有一组三个RGB颜色值,其中两个是蓝色,一个是橙色:
样本集:
颜色1:81,177,206(蓝色)
颜色2:36, 70, 224(蓝色)
颜色3:255, 132, 0(橙色)
必须将这组由3个颜色值组成的样本集与更大的颜色值集进行匹配,以查看是否存在完全匹配或任何模式匹配,其中颜色的RGB值变化在可接受的范围内。假设任何RGB组件的值都可以高于或低于3位数字。
假设我们要搜索的已知颜色值集如下:
Color 1 Color 2 Color 3
Sample A: [25, 25, 25], [10, 10, 10], [100, 100, 100]
Sample B: [125, 125, 125], [10, 10, 10], [200, 200, 200]
Sample C: [13, 87, 255], [10, 10, 10], [100, 100, 100]
Sample D: [67, 111, 0], [10, 10, 10], [200, 200, 200]
Sample E: [255, 255, 255], [10, 10, 10], [100, 100, 100]
考虑到这种情况,我们运行样本集时会发现零个匹配项,因为已知颜色中没有一个颜色的Color 1与我们的样本集数值接近。然而,让我们将另一种颜色添加到已知集合中,它将返回一个正匹配项:
Sample F: [81,177,206], [36, 70, 224], [255, 132, 0]
如果在 Known Set 中存在以下 RGB 值的 Sample F,则会返回匹配结果,因为它与我们样本集中的 Color 1 的确切 RGB 值相同。此外,我们需要接受 RGB 值的差异程度,所以以下内容也将返回匹配结果,因为每个 RGB 值都与样本集中的 Color 1 的值相差不超过 3 位数字:
正匹配:(请记住,Color 1 是:81,177,206)
Sample F: 80,177,206(红色通道相差 1 位数字)
Sample F: 81,175,204(绿蓝通道相差 2 位数字)
Sample F: 82,179,208(三个通道均相差不超过 3 位数字)
然而,如果距离太大,则无法找到匹配项。任何 RGB 组件必须在 3 位数字内才能触发正匹配结果。因此,如果 Sample F 看起来像下面这样,我们将不会得到正匹配结果,因为距离太大:
负匹配:
Sample F: 85,177,206(红色通道相差 4 位数字)
Sample F: 81,170,206(绿色通道相差 7 位数字)
Sample F: 81,177,200(蓝色通道相差 6 位数字)
到目前为止,我们只考虑了样本集中的 Color 1。然而,要求考虑整个样本集。因此,如果无法找到颜色 1 的正匹配项,则我们假定没有匹配,并且不考虑样本集中的颜色 2 和 3。
但是,如果我们发现颜色 1 的正匹配结果,比如 80,177,206,它只在红色通道上与 81 相差 1 位数字,那么我们会继续处理颜色 2,如果我们找到了颜色 2 的正匹配结果,那么我们会处理颜色 3 等等。
您对此问题最适合的算法有何建议?我需要一些允许 Known Set 规模扩大而不会影响性能的东西。在实际应用中,Known Set 中可能会有超过 1 百万个样本。
我考虑使用哈希表,每个颜色一个哈希表来构建 Known Set。因此,我可以测试是否存在颜色 1 的匹配项,如果找到,则测试颜色 2 的哈希表,然后在找不到更多匹配项时停止。如果我在所有 3 个颜色/哈希表上都获得了正匹配结果,则说明总体匹配成功,否则就不会。然而,这种方法不允许在每个颜色的 RGB 通道中进行所需的差异。有太多的组合无法构建哈希表来存储所有可能性。
提前感谢您的回答,并感谢您阅读到这里!