English 中文(简体)
比较数据库中的图像
原标题:Compare Images in Database

我从一个图像中得到了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 值。 我需要减少或散列签名。 您可以建议任何方法/ 方法、 链接或图书馆? 任何帮助都会受到欢迎 。

如果需要,我在网 Beans使用爪哇,与MySQL合作。

最佳回答

在看到我们需要150栏之后,想到了两种办法:

  1. Reducing the number of columns according to a logic.
  2. Using perceptual hash (hashing in which close hash values represent close before-hashed values)

然而,在经过一个丑陋和混乱的操作后,代码运作良好。我所做的仅仅是用SQL查询来计算问题,并从数据库中获取最相似的50张照片。我拿到了结果后,我略微整理了一下代码,并且它运作得很快。

因此,我们并不认为真正需要实施上述方法,因为这些方法减少了发现相似之处的成功率,我们也不需要更快。 我们得到了最好的50个结果,因此记忆的复杂性也不是一个问题。

我强烈建议尽可能多地将工作转到“数据库部分”, 并完成查询。

问题回答

您可以使用 SQL 做到这一点 。

如果您想要找到所有复制件, 您可以使用类似的东西( 替代正确的字段名称) 。

SELECT i.[name] FROM images i 
  INNER JOIN 
     (SELECT signature, edge_signature 
          FROM images
           GROUP BY signature, edge_signature
            HAVING COUNT(*) > 1 ) dups
   on i.signature = dups.signature and i.edge_signature = dups.edge_signature;

如果您想要找到某个图像的复制件, 请创建签名并将其放入此 SQL

SELECT i.[name]
  FROM images
    WHERE signature =  $yourCalculatedSignaturehere 
    and edge_signature =  $yourCalculatedEdgeSignaturehere ;

这两种查询都可返回多行(如果没有重复,则返回0行)。

You might be able to speed these queries up using an index on signature, edge_signature, [name] (this index might double the disk space used by your table, but it should significantly improve performance of the query).

hash 最可能不会工作, 因为您正在寻找相似、 不相同的图像。 即使您绘制了与相同密钥相似的图像, 它也不会工作, 因为根据您的比较功能定义, “ 相似” 关系不是过渡性的( 类似 B, B 类似 C, 但 C 可能不类似 A ) 。

我唯一能想到的是存储在 25 * 3 列中, 正如您所说的 。 您可以写 SQL 语句, 以只选择 < enger> may 通过距离测试的图像( 如果差数已经大于阈值, 那么过滤它 ) 。 如果 DB 中的图像不太相似, 那么这个方法应该有效 。 但是, 如果 DB 中的图像非常相似, 这个方法就不好了 。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签