我有一系列小的20x20 BufferedImages,每个都有白色背景和黑色文字,每个BufferedImage包含一个数字,从0到9。
我想要做的是简单地将图像相互比较,并确定它们是否重复(相等)。例如,如果我比较两个都说“2”的图像,那么我希望将其标记为重复。如果其中一个人说5,那么我希望将其标记为不重复。
我想简单地循环遍历图像的所有像素,获取它们的RBG值并将它们存储在一个字符串中,然后比较每个图像的RBG字符串以确定它们是否重复。这是最好的方法,还是有更好/更快的方法?
图像存储在内存中,而不是存储在文件系统中,所以我不能真正md5它们,但是如果md5-ing它们会给出准确的结果并且速度很快,那么我可以将它们存储起来。
答案 0 :(得分:2)
对于基于OCR的解决方案,您可以使用Tesseract(通过Tess4J Java包装器)。该过程如下:
答案 1 :(得分:1)
我想简单地循环遍历图像的所有像素,获取它们的RBG值并将它们存储在一个字符串中,然后比较每个图像的RBG字符串以确定它们是否重复。这是最好的方法,还是有更好/更快的方法?
将像素编码并存储在String中并比较字符串是不必要的。如果图像可以逐像素地进行比较,则将它们作为像素值的数组进行比较。如果成本可以摊销,则校验和散列将是一个很好的加速器。 (您可以在Java中计算任何可以表示为字节的MD5或等效摘要!)
然而,真正的问题是简单的像素比较是否会起作用。有各种各样的事情可以干扰这一点。你说:
图像来自于屏幕不同部分的Robot.createScreenCapture()。
这意味着:
如果其中任何一个发生,那么简单的逐像素比较将不起作用,并且您可能需要进行适当的OCR ...以及其所有成本和复杂性。
Java OCR软件的建议是偏离主题的。谷歌是你的朋友。
答案 2 :(得分:0)
最好为每个数字(或ImageIcon,如果需要)创建单个BufferedImage,然后比较相等性==
。否则,您可能需要进行OCR以尝试找到足够接近的匹配。
答案 3 :(得分: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 "";
}
从here
下载的Base64类