0

我有一系列小的 20x20 BufferedImages,每个都有白色背景和黑色文本,每个 BufferedImage 包含一个数字,从 0 到 9。

我想要做的是简单地将图像相互比较,并确定它们是否重复(相等)。例如,如果我比较两张都说“2”的图像,那么我希望将其标记为重复。如果其中一个说 5,那么我希望将其标记为不重复。

我正在考虑简单地循环图像的所有像素,获取它们的 RBG 值并将它们存储在一个字符串中,然后比较每个图像的 RBG 字符串以确定它们是否重复。这是最好的方法,还是有更好/更快的方法?

图像存储在内存中,而不是文件系统上,所以我不能真正对它们进行 md5 处理,但是如果 md5-ing 它们会给出准确的结果并且速度很快,那么我可以将它们存储起来。

4

4 回答 4

2

对于基于 OCR 的解决方案,您可以使用Tesseract(通过Tess4J Java 包装器)。该过程可以如下:

  1. 将缓冲图像缩放到 300 DPI
  2. 设置为仅识别数字 (SetVariable("tessedit_char_whitelist", "0123456789"))
  3. 将页面分段模式 (PSM) 设置为 10(对于单个字符)
  4. 获取识别文本
于 2013-09-15T14:05:58.727 回答
1

我正在考虑简单地循环图像的所有像素,获取它们的 RBG 值并将它们存储在一个字符串中,然后比较每个图像的 RBG 字符串以确定它们是否重复。这是最好的方法,还是有更好/更快的方法?

无需在字符串中编码和存储像素并比较字符串。如果可以逐像素比较图像,则将它们作为像素值数组进行比较。校验和或散列将是一个很好的加速器,前提是成本可以摊销。(您可以计算任何可以表示为字节的 MD5 或 Java 中的等效摘要!)

然而,真正的问题是简单的逐像素比较是否可行。有各种各样的事情可以干扰这一点。你说:

图像来自屏幕不同部分的 Robot.createScreenCapture()。

这意味着:

  • 数字可能是不同的字体,
  • 数字可能是相同的字体,但样式或字体大小不同,
  • 数字图像可能在 20x20 图像内未对齐或旋转
  • 数字渲染可以使用可能受屏幕分辨率等影响的抗锯齿,
  • 可能有无关的东西;例如,如果图像剪辑不正确,
  • 可能有背景资料;例如,如果它不是“纯”白色。

如果发生其中任何一种情况,那么简单的逐像素比较将不起作用,您可能需要进行适当的 OCR ......及其所有成本和复杂性。

Java OCR 软件的建议是题外话。谷歌是你的朋友。

于 2013-09-15T01:48:31.583 回答
0

您最好为每个数字(或 ImageIcon,如果需要)创建一个 Single BufferedImage,然后比较是否相等,==. 否则,您可能需要执行 OCR 来尝试找到足够接近的匹配项。

于 2013-09-15T01:03:49.580 回答
0

我从这个问题中得到了答案

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;

protected boolean areEqual(BufferedImage img1, BufferedImage img2)
{
    String str1 = imgToStr(img1);
    String str2 = imgToStr(img2);        
    return str1.equals(str2);
}

protected String imgToStr(BufferedImage img)
{
    ByteArrayOutputStream os = new ByteArrayOutputStream();        
    try
    {
        OutputStream b64 = new Base64.OutputStream(os);
         ImageIO.write(img, "png", b64);
        String result = os.toString("UTF-8");   
        return result;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }        
    return "";

}

从这里下载的 Base64 类

于 2013-09-15T01:32:08.307 回答