如何修复二维码图片中的遮挡块

How to repair obscured blocks in a QR code image

我有许多 RGB 图像,其中包含打印的 sheet 纸张和室外设置中的 QR 码。由于明亮的阳光干扰图像拍摄,大约 20% 的图像不可读:

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

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

但是其中一些仍然不可读,比如这个。我用肉眼可以看出我需要填充左上角的一些锚点,所以我在 MS Paint 中模拟了这个:

通过手动操作,现在可以轻松阅读此图像。有没有办法自动进行这种修复?我不介意翻译来自 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)])

您也许可以改进您的一些图像,但您提供的图像已经失去了太多的黑色,变成了纯白色。因此会出现太大而无法闭合的间隙。我在 Imagemagick 命令行中知道的最好方法是使用 -lat(局部区域阈值)处理转换为灰度的图像,并且可能打开一些形态学。

输入:

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


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