首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >损伤QrCode重构

损伤QrCode重构
EN

Stack Overflow用户
提问于 2019-01-18 10:40:36
回答 2查看 7K关注 0票数 0

图像下面的编辑是对原始图像进行预处理的序列.1.原始图像-> 2.模糊x n次使qrcode位置显着性-> 3.裁剪原始图像,使用blob -> 4从第二步提取位置.锐化和阈值-> 5.检查3平方的qrcode -> 6.进行额外的变换,如旋转-> (最终图像)(具有调整大小分辨率的裁剪图像).

老问题我正在尝试从原始图像中重建qrcode。如您所见,照片已经损坏了qrcode,所以我使用Aforge库从使用blob的图像中检测到3平方。现在我不明白的是从这些信息生成qrcode的逻辑。从技术上讲,是否有可能用给定的信息重构qrcode?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-18 12:14:42

这是个有趣的问题。回答你的问题,这在技术上是可能的吗。是的当然有可能。您问题中的QR代码编码为"5176941.12“。

这是预先拥有的图像,这样就可以更容易地手动设置像素。

在这个步骤之后,我使用excel逐个设置每个像素。在那之后,简单地把你的手机指向电脑屏幕。这就是看起来的样子。如果你想要excel表,你可以得到它这里

既然可能性的问题已经不存在了,该如何实现自动化呢?如果不知道更多的样品,就很难确定。然而,仅仅基于这个示例,最简单的方法就是在裁剪的QR图像上对齐21x21网格,并使用阈值填充这些值。然后把这个图像传递给你的QR解码器。QR代码有一定程度的冗余,因此即使缺少一些像素,您也很可能能够恢复原始数据。

编辑

下面是python中的一些代码,这些代码可以指导您如何实现自动化。有几件事要注意:

  • 我绕开了检测这三个盒子的步骤,手动地把它切得很紧。如果捕获过程中存在旋转,则需要修复它。
  • 阈值0.6需要针对不同的图像进行调整。现在,尽管存在多个错误,但“幸运”仍然有效。如果错误太大,可能永远不会有有效的qr代码。

代码:

代码语言:javascript
复制
import cv2
import numpy as np

def fill3box(qr):
    qr[0:7,0:7] = 1
    qr[14:21,14:21] = 1
    qr[14:21,0:7] = 1
    qr[0,0:6]=0
    qr[0:6,0]=0
    qr[0:6,6]=0
    qr[6,0:7]=0
    qr[2:5,2:5]=0
    qr[14:21,14:21] = qr[0:7,0:7]
    qr[14:21,0:7] = qr[0:7,0:7]
    return qr

im = cv2.imread('to_process.png')
im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
im = cv2.resize(im,(210,210))

im = 1-((im - im.min())/(im.max()-im.min())) #normalize and adjust contrast
avg=np.average(im)
qr = np.ones((21,21))
w,h = im.shape[:2]
im_orig = im.copy()

im[im<avg]=0#binarize
im[im>avg]=1
for y in range(21):
    for x in range(21):
        x1,y1 = (round(x*w/21),round(y*h/21))
        x2,y2 = (round(x1+10),round(y1+10))

        im_box = im[y1:y2,x1:x2]
        if np.average(im_box)<0.6 and qr[y,x]!=0:#0.6 need tweaking
            qr[y,x]=0

qr = fill3box(qr) #clean up 3 box areas as they need to be fixed
# debug visualization
for x in range(21):
    p1 = (round(x*w/21),0)
    p2 = (round(x*w/21),h)
    cv2.line(im_orig,p1,p2,(255),1)

for y in range(21):
    p1 = (0,round(y*h/21))
    p2 = (w,round(y*h/21))
    cv2.line(im_orig,p1,p2,(255),1)

qr = cv2.resize(qr,(210,210),interpolation=cv2.INTER_NEAREST)

im = (im*255).astype(np.uint8)
qr= (qr*255).astype(np.uint8)
im_orig= (im_orig*255).astype(np.uint8)

cv2.imwrite('im.png',im)
cv2.imwrite('qr.png',qr)
cv2.imwrite('im_orig.png',im_orig)

在代码中裁剪图像to_process.png

将网格覆盖以显示此方法的工作方式。

清晰的图像。

重新生成的QR,请注意,即使存在多个错误,它仍然工作。

票数 7
EN

Stack Overflow用户

发布于 2019-01-18 11:03:50

这将是困难的。

如果您可以使用读取器来解码这个QR (我试过了,但失败了),那么就可以使用编写器重新编码它。但是不能保证作者会重新创建相同的代码,因为不同的编码选项是可能的。

如果你的目标实际上是能够破译,你就被困住了。解码“手工”可能是可能的,但是冗长和复杂的。您还可以考虑在完美的网格上手工重绘代码,并将其传递给读者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54252250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档