【问题标题】:Dealing with "white speckles" within QR code images with ZXing用 ZXing 处理 QR 码图像中的“白斑”
【发布时间】:2014-04-05 06:24:32
【问题描述】:

我在扫描激光或喷墨打印的 QR 码时遇到了故障,我猜这是由于固体墨水/碳粉覆盖率不足以及我在两者中使用的图像处理参数的组合我可以控制的转换步骤。我想出了一个“解决方案”,但我不知道它有多强大,我想了解正在发生的事情以及是否有更可靠的方法。

我无法控制将作为输入接收的 PDF 文件,并且我不知道有任何工具可以可靠地让我检查我拥有的 PDF 样本中的图像,但我很确定这些样本是某种灰度图像。例如,这里是一个使用 Acrobat Reader 放大的 QR 码单元的一角的屏幕快照。我假设黑色内的模糊圆圈代表图像中的单个“光”像素。

为了将 PDF 转换为 PNG 文件,我使用带有 sDevice=pnggrey 的 ghostscript。在ZXing无法识别输出分辨率为200dpi的二维码后,我将输出分辨率改成100dpi就成功了,大概是因为通过将亮像素与周围更多的黑色像素进行平均,得到的水平低于随后用于将图像转换为 ZXing 处理的单色图像的阈值。

随后的图像处理步骤来自 ZXing.rb Ruby gem,包括来自 ZXing 的对 LuminanceSource 和 GlobalHistogramBinarizer 的调用。后者使用单个全局黑点进行二值化,并建议将HybridBinarizer 用于桌面应用程序,但由于在线版 ZXing 上的图像也失败了,所以我没有费心尝试“HybridBinarizer”。

200 dpi(失败)图像:

100 dpi(后续)图像:

更新:我尝试以 600 dpi 扫描转换 PDF,并且也成功了。很感兴趣,然后我用手机拍了一张打印出来的图像,这是生成的 JPEG 中一个模块的放大版:

正如预期的那样,手机二维码应用几乎可以从任何角度和距离识别图像。

更新 2 以下是(后续)600dpi (PNG) 图像中的一些代码:

【问题讨论】:

    标签: image image-processing zxing qr-code


    【解决方案1】:

    问题实际上是抖动和灰度之间的区别。该库有一个深刻的假设,即图像类似于照片,并且黑白边界看起来像是通过灰色阴影从黑色到白色的连续变化。黑白边框被抖动成黑白棋盘图案以表示灰色的图像效果不佳,因为当只有一个时,这些被解释为许多微小的黑白过渡。

    最好的办法是避免在管道中出现抖动阶段,但它可能超出您的控制范围。如果是这样,那么您最好的选择是下采样或模糊过滤器,这是您已经看到的。由于斑点区域塌陷,因此 100 dpi 图像有效。

    我认为二值化器不会对这种情况产生太大影响。

    【讨论】:

    • 一如既往,感谢您及时周到的回复,肖恩。由于越来越多的印刷材料是由数字设备生产的,这些设备实际上结合了二进制成像和半色调以实现灰度/颜色变化,我认为您所指的照片的半连续性质更多是相机的功能-运动引起的或合成的模糊,而不是底层图像的属性。查看更新后的问题,了解更多信息。
    • 是的,来自手持相机的图像总是有足够的低级运动模糊和不精确的焦点来消除半色调。下采样或光模糊滤镜是在需要时实现相同效果的廉价方法。
    • +1 为您提供帮助,肖恩。下采样似乎最便宜/最简单,但是您能否提供有关如何设置它以最大化分辨率同时仍消除半色调问题的任何指导?另外,您能解释一下为什么将分辨率从 200 提高到 600 效果也很好吗?
    • 由于半色调点是 ​​1 个像素,我想我想将大小调整为原始大小的 50% 是一个不错的起点。 2 个像素将折叠成 1 个像素。我不知道 600dpi 的情况,我想我不清楚在这种情况下半色调是更小还是更大。
    • 澄清一下,半色调仅在打印纸张时发生,并且在该打印过程中没有任何变化,就像将打印页面扫描为 PDF 时没有任何变化一样。当 PDF 文件转换为 PNG 文件时,分辨率被设置为 ghostscript 参数。由于这种情况下的输出格式始终为灰度,因此不会出现半色调。我添加了第二个更新,包括将 PDF 以 600dpi 渲染为 PNG 的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多