如何检查两个 BufferedImages 是否相等忽略白色?
How To Check If Two BufferedImages Are Equal Ignoring Color White?
我有一个 BufferedImage image1
和 BufferedImage image2
,我想知道它们是否相等。
image1
是预先制作并存储到图像文件中,我在其中使用 ImageIO
进行转换。然而,image2
是现场制作的,所以几乎可以保证它们的尺寸不同。我所知道的是 image2
将等于 9 个不同的 image1
之一。
所以,我想做的是检查它们是否是同一幅图像,但忽略边缘上的所有白色像素,因为它们大小不同,所以如果我比较所有像素,它们无论如何都会不同.如果您想知道为什么边缘有白色,图像是数字,所以剩余的 space 将是白色。
如果你想让它更简单,真实图像的颜色将始终是黑色,但如果你把它做成一个通用的解决方案(意味着考虑所有颜色)我会更好,这样我就可以使用概念稍后。
private boolean equals(BufferedImage image1, BufferedImage image2) {
// This is what I want to fill out.
}
我首先尝试做的是找到 image1
的第一个非白色像素和 image2
的第一个非白化像素,然后检查之后的行以查看如果一切都是平等的。然而,图像非常大,这种方法需要超过 O(n ^ 2)。我需要一个更快的方法。
What I first tried to do was to find the first non-white pixel of image1, and the first non-whiten pixel of image2, and then check the rows after that to see if everthing is equal. However, the images are pretty big, and this approach takes more than O(n ^ 2). I need a faster way.
很可能没有使用这种方法的更快方法。您可以使用边缘检测,但其算法并不是真的更快。
我会尝试为每个图像(数字)使用边界框。
如果可以将 image1 保存为数字大小,这是可行的方法。只需将图像缩小到数字的实际大小并将该图像保存到磁盘即可。然后你也可以将 image2 缩小到它的边界框,比较非常简单和快速。
如果缩小不是一个选项,则计算边界框是一个选项。遍历图像数组并检测两个图像中最顶部和最左侧的像素。然后,您至少获得顶部和左侧的边界边缘,这是比较图像所需的全部。 (如果图像大小不同,则需要整个边界框)
顺便说一下,您不需要 运行 复杂度为 O(n^2)。如果您检测到两个图像中最顶部或最左侧的像素,则可以设置一个偏移量作为工作起点。你只需要找到一个不同点就可以说明这些数字是不同的。您可以使用逻辑来确定它必须基于简单测试的数字。例如,取数字一 (1) 和零 (0)。零在中间部分有白色像素,而一必须在那里有黑色像素,反之亦然。因此,检测数字肯定是黑色或白色的区域可以帮助您通过测试多达 9 个区域来估计图像中的数字。
我有一个 BufferedImage image1
和 BufferedImage image2
,我想知道它们是否相等。
image1
是预先制作并存储到图像文件中,我在其中使用 ImageIO
进行转换。然而,image2
是现场制作的,所以几乎可以保证它们的尺寸不同。我所知道的是 image2
将等于 9 个不同的 image1
之一。
所以,我想做的是检查它们是否是同一幅图像,但忽略边缘上的所有白色像素,因为它们大小不同,所以如果我比较所有像素,它们无论如何都会不同.如果您想知道为什么边缘有白色,图像是数字,所以剩余的 space 将是白色。
如果你想让它更简单,真实图像的颜色将始终是黑色,但如果你把它做成一个通用的解决方案(意味着考虑所有颜色)我会更好,这样我就可以使用概念稍后。
private boolean equals(BufferedImage image1, BufferedImage image2) {
// This is what I want to fill out.
}
我首先尝试做的是找到 image1
的第一个非白色像素和 image2
的第一个非白化像素,然后检查之后的行以查看如果一切都是平等的。然而,图像非常大,这种方法需要超过 O(n ^ 2)。我需要一个更快的方法。
What I first tried to do was to find the first non-white pixel of image1, and the first non-whiten pixel of image2, and then check the rows after that to see if everthing is equal. However, the images are pretty big, and this approach takes more than O(n ^ 2). I need a faster way.
很可能没有使用这种方法的更快方法。您可以使用边缘检测,但其算法并不是真的更快。
我会尝试为每个图像(数字)使用边界框。
如果可以将 image1 保存为数字大小,这是可行的方法。只需将图像缩小到数字的实际大小并将该图像保存到磁盘即可。然后你也可以将 image2 缩小到它的边界框,比较非常简单和快速。
如果缩小不是一个选项,则计算边界框是一个选项。遍历图像数组并检测两个图像中最顶部和最左侧的像素。然后,您至少获得顶部和左侧的边界边缘,这是比较图像所需的全部。 (如果图像大小不同,则需要整个边界框)
顺便说一下,您不需要 运行 复杂度为 O(n^2)。如果您检测到两个图像中最顶部或最左侧的像素,则可以设置一个偏移量作为工作起点。你只需要找到一个不同点就可以说明这些数字是不同的。您可以使用逻辑来确定它必须基于简单测试的数字。例如,取数字一 (1) 和零 (0)。零在中间部分有白色像素,而一必须在那里有黑色像素,反之亦然。因此,检测数字肯定是黑色或白色的区域可以帮助您通过测试多达 9 个区域来估计图像中的数字。