Java 如何检查两个缓冲区图像是否相等(忽略白色)?
我有一个Java 如何检查两个缓冲区图像是否相等(忽略白色)?,java,bufferedimage,Java,Bufferedimage,我有一个BufferedImage图像1和BufferedImage图像2,我想知道它们是否相等 image1是手工制作的,并存储到一个图像文件中,在那里我使用ImageIO进行转换。然而,image2是现场制作的,因此可以保证它们有不同的尺寸。我所知道的是,image2将等于9个不同的image1中的一个 所以,我想做的是检查它们是否是相同的图像,但是忽略边缘上的所有白色像素,因为它们的大小不同,所以如果我比较所有像素,无论什么,它们都会不同。如果你想知道为什么边上有白色,图像是数字,所以剩余
BufferedImage图像1
和BufferedImage图像2
,我想知道它们是否相等
image1
是手工制作的,并存储到一个图像文件中,在那里我使用ImageIO
进行转换。然而,image2
是现场制作的,因此可以保证它们有不同的尺寸。我所知道的是,image2
将等于9个不同的image1
中的一个
所以,我想做的是检查它们是否是相同的图像,但是忽略边缘上的所有白色像素,因为它们的大小不同,所以如果我比较所有像素,无论什么,它们都会不同。如果你想知道为什么边上有白色,图像是数字,所以剩余的空间是白色的
如果你想让它更简单,真实图像的颜色将始终是黑色,但我更希望它是一个通用的解决方案(意味着考虑所有颜色),这样我可以在以后使用这些概念
private boolean equals(BufferedImage image1, BufferedImage image2) {
// This is what I want to fill out.
}
我第一次尝试做的是找到image1
的第一个非白色像素,以及image2
的第一个非白色像素,然后检查之后的行,看是否所有内容都相等。然而,图像非常大,这种方法需要的时间超过O(n^2)。我需要一个更快的方法
我第一次尝试的是找到image1的第一个非白色像素,和image2的第一个非白色像素,然后检查之后的行,看是否所有东西都相等。然而,图像非常大,这种方法需要的时间超过O(n^2)。我需要一个更快的方法
最有可能的是,没有非常快速的方法使用这种方法。您可以使用边缘检测,但用于边缘检测的算法也不是很快
我会尝试为每个图像(数字)使用边界框
如果可以将image1保存为数字的大小,那么这就是解决方法。只需将图像缩小到数字的真实大小,然后将该图像保存到磁盘。然后还可以将image2收缩到其边界框,比较非常简单和快速
如果“收缩”不是选项,则边界框的计算是选项。检查图像阵列并检测两幅图像中最上面和最左边的像素。然后,您至少可以获得顶部和左侧的边界,这就是比较图像所需的全部内容。(如果图像大小不同,则需要整个边界框)
顺便说一下,您不需要在O(n^2)中运行。如果在两幅图像中都检测到最上面或最左边的像素,则可以设置要从中工作的偏移量。你只需要找出一个差异来说明这些数字是不同的。您可以使用逻辑来确定它必须基于简单测试的数字。例如,以数字1和0为例。而零在中间部分有白色像素,其中一个必须有黑色像素在那里,反之亦然。因此,检测数字肯定是黑色或白色的区域可以帮助您通过测试多达9个区域来估计图像中的数字