如何确定两个小的BufferedImages是否重复?

时间:2013-09-15 01:01:19

标签: java image-processing ocr bufferedimage

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

  1. 将缓冲图像缩放至300 DPI
  2. 设置为仅识别数字(SetVariable(“tessedit_char_whitelist”,“0123456789”))
  3. 将页面分割模式(PSM)设置为10(单个字符)
  4. 获得认可的文字

答案 1 :(得分:1)

  

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

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

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

  

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

这意味着:

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

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

Java OCR软件的建议是偏离主题的。谷歌是你的朋友。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我从this question

得到了答案
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 "";

}

here

下载的Base64类