我从图像中获取 25 个样本,获取它们的平均 rgb 值并将它们保存在 5x5 颜色数组中。这些是我的“签名”。签名中的值如下所示:
Color signature[5][5];
-21233 -1 -323211 ... ...
-123 -12323 ...
...
我可以从签名的索引中获得红色、蓝色和绿色值。我使用这些值来比较两个图像的签名并获得“差异”值。
signature[1][1].getBlue() = 123, Color[1][1].getRed() = 200 ..
for (int x = 0; x < 5; x++) {
for (int y = 0;y < 5; y++) {
int r1 = signature[x][y].getRed();
int g1 = signature[x][y].getGreen();
int b1 = signature[x][y].getBlue();
int r2 = signature2[x][y].getRed();
int g2 = signature2[x][y].getGreen();
int b2 = signature2[x][y].getBlue();
double tempDiff = Math.sqrt((r1 - r2) * (r1 - r2)
+ (g1 - g2) * (g1 - g2)
+ (b1 - b2) * (b1 - b2));
difference += tempDiff;
}
}
我还获得了图像的第二个签名,显示了它们边缘找到的版本的签名。比较两张图像,我将正常特征差异与边缘特征差异相乘,得到最终的差异值。
在比较两张图像时,一切都很好。但是,我得到了很多图像,所以我将签名保存在数据库中,如下所示:
Table images:
-COLUMN name- -COLUMN signature- -COLUMN edge signature-
myimg.jpg |-12312 -132 -2 ... (25 of them) |-123 -1 -1234 -6921 .. (25 of them)|
我只是将签名索引与它们之间的空格连接起来并保存为字符串。
这是我的问题:我需要找到一张图片的相似之处。如果我从数据库中选择所有图像,事情会变得非常缓慢并且我的内存不足。我可以从数据库中选择 1000 张图像,比较并获取下 1000 张,但这甚至更慢。
我需要一种方法来比较查询中的图像签名,我准备好更改我的表的列,甚至准备尝试具有 100 列包含签名的所有 RGB 值的疯狂表。我需要减少或散列签名。您可以建议任何方法/方法、链接或库吗?任何帮助,将不胜感激。
如果需要,我在 NetBeans 上使用 Java,与 MySQL 一起工作。