我有许多RGB图像,其中包含在室外设置中具有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)])
答案 0 :(得分:1)
您也许可以改善某些图像,但是您提供的图像丢失了太多的黑色到纯白色。因此,差距将显得太大而无法弥补。我在Imagemagick命令行中了解的最好方法是,使用-lat(局部阈值化)处理可能转换为灰度的图像,也许还会打开一些形态。
输入:
convert img.jpg -colorspace gray -negate -lat 50x50-1% -negate -morphology open square:7 result.png
通常,人们会将%项用作正数。但是在这里,您丢失了太多数据,我想在使黑色过多之前,尽可能多地包含非纯白色的数据。所以我把它推到-1%。由于-lat仅适用于黑色背景上的白色对象,因此需要-negate。所以我必须在之前和之后否定。然后,我尝试使用一些开放的形态填充一些黑色区域。