如何修复二维码图片中的遮挡块
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 仅适用于黑色背景上的白色对象。所以我必须前后否定。然后我尝试使用一些开放的形态来填充一些黑色区域。
我有许多 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 仅适用于黑色背景上的白色对象。所以我必须前后否定。然后我尝试使用一些开放的形态来填充一些黑色区域。