如何修复QR码图像中的模糊块

时间:2019-07-25 02:04:34

标签: python r imagemagick barcode zbar

我有许多RGB图像,其中包含在室外设置中具有QR码的打印纸。由于灿烂的阳光干扰图像捕获,因此大约20%的图像无法读取:

enter image description here

我在R中使用magick来处理图像操作,然后使用Python软件包pyzbar(包装zbar)来进行检测。

我可以使用image_threshold来查找95%分位数以内的所有像素,并将其强制为纯黑色,这将修复大约一半的图像:

enter image description here

但是其中一些仍然无法读取,就像这样。我用肉眼可以看到我需要填充左上角的一些锚点,因此我在MS Paint中对其进行了模拟:

enter image description here

通过该手动操作,现在可以轻松读取此图像。有什么办法可以自动进行这种修复?我不介意从Python或ImageMagick CLI转换代码,因此仅R答案是不必要的。

我的一般做法:

library(magick)
library(reticulate)
pyzbar <- import("pyzbar.pyzbar")

magick_to_numpy <- function(img) {
  round(255 * as.numeric(magick::image_data(img, "rgb")))
}

image_read("testfile.jpg") %>% 
  image_threshold("black", "95%") %>% 
  magick_to_numpy() %>% 
  pyzbar$decode()

正常结果:

list()

所需结果:

[[1]]
Decoded(data=b'W TRR C6 T2', type='QRCODE', 
rect=Rect(left=176, top=221, width=373, height=333), 
polygon=[Point(x=176, y=226), Point(x=202, y=554), 
Point(x=549, y=544), Point(x=524, y=221)])

1 个答案:

答案 0 :(得分:1)

您也许可以改善某些图像,但是您提供的图像丢失了太多的黑色到纯白色。因此,差距将显得太大而无法弥补。我在Imagemagick命令行中了解的最好方法是,使用-lat(局部阈值化)处理可能转换为灰度的图像,也许还会打开一些形态。

输入:

enter image description here

convert img.jpg -colorspace gray -negate -lat 50x50-1% -negate -morphology open square:7 result.png


enter image description here

通常,人们会将%项用作正数。但是在这里,您丢失了太多数据,我想在使黑色过多之前,尽可能多地包含非纯白色的数据。所以我把它推到-1%。由于-lat仅适用于黑色背景上的白色对象,因此需要-negate。所以我必须在之前和之后否定。然后,我尝试使用一些开放的形态填充一些黑色区域。