【问题标题】:How To Check If Two BufferedImages Are Equal Ignoring Color White?如何检查两个缓冲图像是否相等,忽略颜色白色?
【发布时间】:2020-03-01 04:15:58
【问题描述】:

我有一个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】:

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

    很可能没有更快的方法使用这种方法。您可以使用边缘检测,但其算法也不是真的更快。

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

    如果可以将 image1 保存为数字的大小,那么这就是要走的路。只需将图像缩小到数字的实际大小并将该图像保存到磁盘。然后,您也可以将 image2 缩小到它的边界框,并且比较非常简单和快速。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多