如何检查两个BufferedImage是否等于忽略白色?

问题描述 投票:0回答:1

我有一个BufferedImage image1BufferedImage image2,我想知道它们是否相等。

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)。我需要更快的方法。

java bufferedimage
1个回答
0
投票

我首先尝试做的是找到image1的第一个非白色像素,然后找到image2的第一个非白色像素,然后检查之后的行,看一切是否相等。但是,图像非常大,并且此方法所花费的时间超过O(n ^ 2)。我需要更快的方法。

大多数可能没有使用这种方法的非常快的方法。您可以使用边缘检测,但是用于边缘检测的算法也并不是真的更快。

我将尝试使用每个图像(数字)的边界框。

如果可以保存image1的数字大小,这是可行的方法。只需将图像缩小到数字的实际大小,然后将该图像保存到磁盘即可。然后,您也可以将image2缩小到其边界框,并且比较非常简单快捷。

如果不选择缩小,则边界框的计算是一个选项。遍历图像阵列并检测两个图像中最顶部和最左侧的像素。然后,您至少会获得顶部和左侧的边界边缘,这是比较图像所需的全部。 (如果图像大小可能不同,则需要整个边框)

顺便说一下,您不需要在O(n ^ 2)中运行。如果在两个图像中都检测到最顶部或最左侧的像素,则可以设置一个偏移量。您只需要查找差异即可声明这些数字不同。您可以使用逻辑来确定它必须基于简单测试得出的数字。例如,取数字一(1)和零(0)。零在中间有白色像素,而一个必须在中间有黑色像素,反之亦然。因此,检测数字绝对为黑色或白色的区域可以通过测试多达9个区域来帮助您估计图像中的数字。

© www.soinside.com 2019 - 2024. All rights reserved.