Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查两个缓冲区图像是否相等(忽略白色)?_Java_Bufferedimage - Fatal编程技术网

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个区域来估计图像中的数字