我目前有一个 Java 程序,它将获取图像中每个像素的 rgb 值。我还有一种方法可以在二维值矩阵上计算 Haar 小波。但是我不知道应该为计算 Haar 小波的方法赋予哪些值。我应该平均每个像素的 rgb 值并计算一个 haar 小波吗?或者只使用 r、g、b 中的 1 个。我正在尝试为图像创建一个唯一的指纹。我在其他地方读到这是一个很好的方法,因为我可以取 2 个小波的点积来查看图像彼此之间的相似程度。
请让我知道我应该计算 Haar 小波的值。谢谢杰斯
我目前有一个 Java 程序,它将获取图像中每个像素的 rgb 值。我还有一种方法可以在二维值矩阵上计算 Haar 小波。但是我不知道应该为计算 Haar 小波的方法赋予哪些值。我应该平均每个像素的 rgb 值并计算一个 haar 小波吗?或者只使用 r、g、b 中的 1 个。我正在尝试为图像创建一个唯一的指纹。我在其他地方读到这是一个很好的方法,因为我可以取 2 个小波的点积来查看图像彼此之间的相似程度。
请让我知道我应该计算 Haar 小波的值。谢谢杰斯
您应该将 R/G/B 组件视为不同的图像:为 R、G 和 B 分别创建一个矩阵,然后将小波独立应用于这些部分。
然后,您从 3 个小波压缩通道重建 R/G/B 图像,最后将它们组合成一个 3 通道位图。
由于 eznme 没有回答你的问题(你想要指纹,他解释了压缩和重建),这是你经常遇到的一种方法:
您将颜色和亮度信息(色度和亮度)分开,并对它们进行不同的加权。有时你甚至会丢弃色度而只使用亮度部分。这会显着减小指纹的大小(约三倍),并考虑到我们如何感知图像——主要是通过局部亮度,而不是绝对颜色。作为奖励,您可以获得一些关于图像颜色处理的鲁棒性。
可以通过不同的方式进行分离,例如将 RGB 图像转换为YUV或YIQ颜色空间。如果只想保留亮度分量,这两种颜色空间是等价的。但是,它们对色度进行不同的编码。这是 RGB 中亮度 Y 的线性变换: Y = 0.299*R + 0.587*G + 0.114*B
当您查看数学时,您会注意到我们除了创建灰度图像之外什么也没做——考虑到当它们在数值上都相等时,我们认为绿色比红色更亮,红色比蓝色更亮。
如果您想保留一些色度信息,为了使您的指纹尽可能简洁,您可以降低两个 U、V 分量的分辨率(每个分量实际上是 8 位)。因此,您可以通过将它们的信息减少到 4 位并将它们与移位运算符组合(不知道它在 java 中是如何工作的)将它们加入一个 8 位值。在最终的指纹距离计算(您提到的点积)中,与亮度相比,色度应该更轻。