我最近遇到了同样的问题:在 Java 应用程序中使用 ZXing 库我正在解码 QR 码,但我们经常不得不处理低质量的打印扫描,并且需要提高 QR 码的识别率。我在这里添加我的发现,希望它能帮助面临同样问题的人。
我使用了 ImageJ 图像处理库。它非常广泛,实际上是一个带有 GUI 和许多插件的完整程序。我只使用了api:
<dependency>
<groupId>net.imagej</groupId>
<artifactId>ij</artifactId>
<version>1.52g</version>
</dependency>
文档不是那么有用,这些教程更有趣。
我不得不寻找 API 的 javadocs,你可以在这里找到它们
所以我尝试了一堆图像优化和增强,但似乎没有任何积极的效果。剪掉一个扫描二维码的子图像可以大大加快这个过程。
然后我在这里的另一条评论中尝试了用户@kevto 的建议(谢谢!)
Convert to the image to grayscale.
Resize barcode up to 4 times in height and 8 times in width.
Apply gaussian blur with the size of 17x17 pixels.
Apply binary threshold with the threshold value of 225 and maximum value of 255.
图像已经是灰度的,因此不会影响二维码的识别率。最后一个建议似乎也没有多大作用。第二个有点奇怪:使用不同的宽度和高度参数调整大小会拉伸图像并导致无法识别的二维码。第三个建议是我一直在寻找的:添加高斯模糊可以显着提高 QR 码的识别率,因为扫描质量较低。为高质量扫描的二维码添加模糊会降低识别率,所以要小心。
导致此代码:
public BufferedImage preProcessBufferedImage (BufferedImage bufferedImage)throws IOException{
//get subimage that cuts out the QR code, speeds up the QR recognition process
BufferedImage subImage = bufferedImage.getSubimage(x, y,width,height);
//gaussian blur the result , leads to better QR code recognition
ImagePlus imagePlus = new ImagePlus("process-qr-code", subImage);
imagePlus.getProcessor().blurGaussian(2);
return imagePlus.getBufferedImage();
}
我为模糊函数的 sigma 尝试了很多值。1.5 和 2.5 之间的值给出了最好的结果。
所以我在识别二维码时执行了两次:一次像我之前所做的那样(获得高质量的图像),然后一次进行额外的处理(用于低质量的图像)