【问题标题】:Damaged QrCode Reconstructing [closed]损坏的二维码重建[关闭]
【发布时间】:2019-01-18 10:40:36
【问题描述】:

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

老问题 我正在尝试从原始图像重建 qrcode。如您所见,照片已损坏 qrcode,因此我使用 Aforge 库使用 blob 从图像中检测 3 个正方形。现在我不明白的是从这些信息生成 qrcode 的逻辑。技术上可以用给定的信息重建二维码吗?

【问题讨论】:

    标签: image-processing qr-code aforge


    【解决方案1】:

    这是一个有趣的问题。要回答您的问题,这在技术上是否可行。是的,这当然是可能的。您问题中的二维码编码为“5176941.12”。

    这是预先设置的图像,以便手动设置像素更容易。

    在这一步之后,我使用excel对每个像素进行了逐个设置。之后,只需将手机指向电脑屏幕。这就是它的样子。想要excel表格可以here获取。

    既然可能性问题已经解决了,那么如何自动化呢?在不知道更多其他样本的情况下,很难确定。但是,仅基于此示例,最简单的方法是在裁剪的 QR 图像上对齐 21x21 网格并使用阈值填充值。然后将此图像传递给您的 QR 解码器。二维码具有一定程度的冗余,因此即使某些像素丢失,您也很可能能够恢复原始数据。


    编辑

    这里有一些 Python 代码,可以作为您如何实现自动化的指南。需要注意的几点:

    • 我绕过了检测 3 个框的步骤并手动将其裁剪得很紧。如果捕获过程中有旋转,则需要修复它。
    • 阈值 0.6 需要针对不同的图像进行调整。现在,即使有多个错误,它也“幸运地”工作。如果错误太广泛,您可能永远都没有有效的二维码。

    代码:

    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

    网格叠加以显示此方法的工作原理

    阈值图像。

    重新生成的二维码,注意即使有多个错误它仍然有效。

    【讨论】:

    • 这几乎是我想做的。就我而言,我直接处理视频帧。以前用于对视频帧进行解码的算法不需要太多的处理速度。这是我测试的良好起点。我的目标是重建图像应该能够使用任何 qrcode 库进行解码。
    • 我有一个关于像素分辨率的问题。我将在位图中而不是 excel 中重建此图像。推荐的分辨率是多少? qrcode是否正确并不重要,我会将纠错与帧n时间序列集成
    • 像素分辨率?这并不重要。在重建过程中,您必须从 21x21 网格开始。然后,您可以将其调整为您想要的任何大小。在示例代码中,我将其大小调整了 10 倍。
    【解决方案2】:

    这会很困难。

    如果您可以使用阅读器解码此 QR(我尝试过但失败),则可以使用编写器对其重新编码。但是不能保证作者会重新创建相同的内容,因为可能有不同的编码选项。

    如果您的目标实际上是能够解码,那么您就会陷入困境。 “手动”解码可能是可能的,但冗长而复杂。您还可以考虑在完美的网格上手动重绘代码,然后将其传递给阅读器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2012-10-29
      • 2013-02-25
      相关资源
      最近更新 更多