通过超分辨率重构来提高二维码的对比度

1 问题描述

(1)图像分辨率小。例如一些嵌入在海报(如图1)或远距离拍摄的码,其分辨率远小于通常情况下的码图像。
在这里插入图片描述
图1.海报中的二维码占比很小
(2)图像质量较低。有很多是经过了多次的压缩和转发,存在严重的人工效应(如振铃效应)干扰。
在这里插入图片描述
(3)由于光照等原因,导致二维码亮度不均匀、图像模糊等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 微信超分辨率重构的框架

通常情况下,相比于低分辨率图像,高分辨率图像能够提供更丰富的细节,呈现出良好的视觉效果,对于二维码识别这种以图像作为输入的后续流程,也有助于提高系统的整体表现。然而,受成像设备、存储空间和网络资源的限制,我们常常只能获得较低分辨率的图像。于是,超分辨率技术便派上了用场。
超分辨率技术以低分辨率图像作为输入,重建高分辨率输出,是计算机视觉领域的一个经典问题。传统的基于像素插值的超分算法以其计算简单、速度快的优势,被广泛采用,如最近邻(nearest)插值,双线性(bilinear)插值以及双三次(bicubic)插值等。但它们无法适应多样的图像内容,感知能力较差,难以重建出图像的高频信息,输出图像过于模糊,应用于压缩图像时,甚至会放大人工效应干扰。
近年来,计算机视觉技术和深度学习飞速发展,学术界开始关注利用深度学习解决图像重建问题。我们根据扫码图像的特点,设计了适用于移动端的超分网络,实现了快速高效的码图像重建,并改善图像质量,大大提高了扫码算法的识别成功率。网络结构如图所示。
在这里插入图片描述图1 码图像重建网络结构

3 API

基于OpenCV开发了相应的API。

3.1 cv.wechat_qrcode_WeChatQRCode

cv.wechat_qrcode_WeChatQRCode(detector_prototxt_path, detector_caffe_model_path, super_resolution_prototxt_path, super_resolution_caffe_model_path) -> <wechat_qrcode_WeChatQRCode object>

初始化微信 QR 码检测模块,包括两个基于 CNN 的模型:对象检测模型和超分辨率模型。对象检测模型用于检测带有边界框的二维码。当 QR 码较小时,采用超分辨率模型对其进行放大。

文件地址:https://github.com/WeChatCV/opencv_3rdparty

3.1.1 参数说明:
参数名参数含义
detector_prototxt_path对象检测模型的prototex文件路径
detector_caffe_model_path对象检测模型的caffe模型文件路径
super_resolution_prototxt_path超分辨率模型的prototex文件路径
super_resolution_caffe_model_path超分辨率模型的caffe模型文件路径
3.1.2 返回值:

wechat_qrcode_WeChatQRCode 对象

3.2 cv.wechat_qrcode_WeChatQRCode.detectAndDecode

cv.wechat_qrcode_WeChatQRCode.detectAndDecode(img[, points]) ->retval, points

检测和解析二维码

3.2.1 参数说明:
参数名参数含义
imgopencv 读取的灰度图或 BGR 图
points检测到 QR 码四边形顶点后,将其位置输出到该数组
3.2.2 返回值:

retval: 解析结果

points: QR 码四边形顶点位置数组,如果找不到则为空

4 二维码提升对比度测试

4.1 测试代码:

import cv2
import os

if __name__ == '__main__':
    # 初始化对象
    detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt",
                                              "detect.caffemodel",
                                              "sr.prototxt",
                                              "sr.caffemodel")

    results = {"image": [], "res": [], "points": []}

    image_dir = "src"
    files = os.listdir(image_dir)
    # 遍历图片目录
    for f in files:
        image_file = os.path.join(image_dir, f)
        img = cv2.imread(image_file)  # 读取图像
        res, points = detector.detectAndDecode(img)  # 检测图像
        if res:  # 非空表示检测成功
            results["image"].append(image_file)
            results["res"].append(res)
            results["points"].append(points)

    image_num = len(files)
    detected_num = len(results['res'])
    print("Image dir:", image_dir)
    print(
        f"Processed images: {image_num} , detected images: {detected_num}",
        f"detection success rate : {detected_num / image_num * 100}%. ")
    print("Detected images are:")
    for i in results['image']:
        print(i, end=',')

4.2 输出结果

Image dir: src
Processed images: 134 , detected images: 19 detection success rate : 14.17910447761194%.

Dected images are:
src/4_217.jpg,src/4_135.jpg,src/10_144.jpg,src/4_171.jpg,src/19_146.jpg,src/4_148.jpg,src/19_164.jpg,src/6_29.jpg,src/19_171.jpg,src/4_39.jpg,src/2.jpg,src/6_41.jpg,src/19_162.jpg,src/19_154.jpg,src/19_181.jpg,src/4_228.jpg,src/4_140.jpg,src/4_26.jpg,src/4_38.jpg

Image dir: detect
Processed images: 137 , detected images: 22 detection success rate : 16.05839416058394%.

Detected images are:
detect/4_217.jpg,detect/4_171.jpg,detect/19_146.jpg,detect/4_148.jpg,detect/19_164.jpg,detect/4_196.jpg,detect/19_151.jpg,detect/4_76.jpg,detect/4_81.jpg,detect/4_39.jpg,detect/19_159.jpg,detect/2.jpg,detect/19_165.jpg,detect/6_41.jpg,detect/19_162.jpg,detect/19_154.jpg,detect/19_137.jpg,detect/5_13.jpg,detect/4_132.jpg,detect/4_228.jpg,detect/4_26.jpg,detect/4_38.jpg

5 简单分析

以未能成功检测的src/5_50.jpg为例:

该图片通过微信扫码可以成功检测,检测成功时摄像头离图片较近,因此考虑在 QR 检测程序中对图片进行缩放预处理:

x, y = img.shape[0:2]
img = cv2.resize(img, (int(y * 1.5), int(x * 1.5)))

结果如下:
Image dir: detect
Processed images: 137 , detected images: 33 detection success rate : 24.087591240875913%.
Detected images are:
detect/4_217.jpg,detect/4_135.jpg,detect/10_144.jpg,detect/4_171.jpg,detect/4_133.jpg,detect/4_69.jpg,detect/19_164.jpg,detect/19_151.jpg,detect/6_29.jpg,detect/4_76.jpg,detect/6_2.jpg,detect/7_47.jpg,detect/4_81.jpg,detect/4_39.jpg,detect/2.jpg,detect/19_165.jpg,detect/15_75.jpg,detect/7_44.jpg,detect/7_7.jpg,detect/6_12.jpg,detect/19_162.jpg,detect/11_99.jpg,detect/4_100.jpg,detect/19_154.jpg,detect/19_137.jpg,detect/5_50.jpg,detect/5_13.jpg,detect/19_181.jpg,detect/14_11.jpg,detect/4_228.jpg,detect/6_30.jpg,detect/4_26.jpg,detect/4_38.jpg

Image dir: src
Processed images: 134 , detected images: 32 detection success rate : 23.88059701492537%.
Detected images are:
src/4_217.jpg,src/4_135.jpg,src/10_144.jpg,src/4_171.jpg,src/19_146.jpg,src/4_69.jpg,src/19_164.jpg,src/4_196.jpg,src/6_29.jpg,src/4_76.jpg,src/19_171.jpg,src/6_2.jpg,src/4_220.jpg,src/7_47.jpg,src/4_81.jpg,src/7_29.jpg,src/4_39.jpg,src/19_159.jpg,src/4_237.jpg,src/2.jpg,src/19_165.jpg,src/15_75.jpg,src/4_115.jpg,src/19_162.jpg,src/19_154.jpg,src/5_50.jpg,src/5_13.jpg,src/19_181.jpg,src/4_228.jpg,src/6_30.jpg,src/4_26.jpg,src/4_38.jpg

测试结果表明 opencv 中的 QR 码识别 API 主要针对理想位置和大小的 QR 码图像进行识别,而简单的图像预处理可以提高 QR 码识别成功率。

6 总结及展望

我们目前通过调用微信API来实现检测和超分辨率重构,下一步工作将搭建图1所示的网络,利用微信已经训练好的模型,来看看通过超分辨率重构后的效果。

参考文献

https://blog.csdn.net/qq_35054151/article/details/113647111

### 回答1: Matlab超分辨率重构是指利用Matlab软件对低分辨率图像进行处理,从而提高其分辨率的一种技术。 在图像处理领域,超分辨率重构是一个重要的研究方向。由于图像的低分辨率会导致图像细节丢失,影响图像质量和可视性。因此,超分辨率重构技术的出现可以在一定程度上解决该问题。 Matlab作为一种强大的科学计算与数据可视化工具,具有丰富的图像处理函数和工具箱,可以用于实现超分辨率重构算法。 Matlab超分辨率重构通常包括以下几个步骤: 首先,读入低分辨率图像数据。可以通过imread函数读取图像文件,将其转化为Matlab中的图像矩阵。 然后,对图像进行预处理。包括去噪、图像增强等步骤。可以利用Matlab提供的滤波器函数、图像增强函数等对图像进行处理。 接下来,选择适当的超分辨率重构算法。常用的算法包括插值算法、基于稀疏表示的算法、深度学习算法等。 最后,根据选择的算法,对预处理后的图像进行超分辨率重构。例如,可以利用Matlab的imresize函数实现插值算法,利用图像处理工具箱中的函数实现其他算法。 需要注意的是,在进行超分辨率重构时,应根据具体应用场景和需求选择合适的算法和参数,以达到较好的效果。 总之,Matlab超分辨率重构是一种利用Matlab软件对低分辨率图像进行处理,提高图像分辨率的技术。通过适当的预处理和选择合适的重构算法,可以改善图像质量和可视性,适用于图像处理领域的研究和实际应用。 ### 回答2: Matlab是一门常用于科学计算和工程设计的编程语言,其强大的数学和图像处理功能使其成为图像超分辨率重构的理想工具。 图像超分辨率重构是一种通过一系列算法和技术提高图像分辨率的方法。在低分辨率图像中,由于像素数量有限,细节会变得模糊,这给图像分析和识别带来了挑战。超分辨率重构的目标是将低分辨率图像提高到高分辨率水平,以便更好地识别和分析图像。 使用Matlab进行图像超分辨率重构可以通过下列步骤实现: 1. 导入低分辨率图像:使用Matlab的图像处理工具箱中的函数,可以将低分辨率图像加载到Matlab环境中。 2. 图像预处理:低分辨率图像可能包含噪声和其他干扰。可以使用Matlab中的滤波器函数,如高斯滤波器或中值滤波器,来提取图像中的噪声以及其他干扰。 3. 超分辨率算法选择:根据图像的特点和需求,选择合适的超分辨率算法。一些常用的算法包括插值、图像金字塔、稀疏表示和机器学习等。 4. 应用超分辨率算法:使用Matlab实现所选择的超分辨率算法。根据算法的不同,可能需要使用Matlab中的矩阵操作、图像变换或者图像重建函数。 5. 后处理:通过Matlab中的调整函数,对重建后的图像进行亮度、对比度、饱和度等方面的调整,使图像看起来更自然。 6. 评估:使用Matlab中的图像质量评估工具,如PSNR和SSIM等指标,评估重建图像的质量。 7. 导出:将重建的高分辨率图像导出为所需的图像格式。 Matlab提供了丰富的图像处理函数和工具箱,使图像超分辨率重构过程更加高效和方便。通过合理选择算法和优化参数,使用Matlab进行图像超分辨率重构可以得到更精细、更清晰的图像,提供更好的图像分析和识别能力。 ### 回答3: MATLAB超分辨率重构是一种通过使用高分辨率图像和低分辨率图像之间的关系,来提高图像质量的方法。该方法基于插值和图像处理算法,可以在不增加额外信息的情况下,将低分辨率图像重建为高分辨率图像。 在MATLAB中,可以使用一些图像处理工具箱来实现超分辨率重构。首先,通过将低分辨率图像输入到算法中,并使用插值算法对图像进行处理,得到一个初始的高分辨率近似图像。然后,使用一个超分辨率重构算法,如基于样本的学习方法、稀疏编码方法或深度学习方法,对初始图像进行优化,以提高图像的细节和清晰度。 超分辨率重构算法的核心思想是利用图像中的局部信息和统计特性,将低分辨率图像的信息转化为高分辨率图像的信息。通过不断迭代和优化,可以逐步提高生成图像的质量,并使其接近原始高分辨率图像。 然而,超分辨率重构并不是一个完美的过程,它可能会在一些细节和纹理上引入一些伪影和失真。因此,在使用超分辨率重构方法时,需要根据具体的应用场景和要求进行选择和调整,以获得最佳的重建效果。 总的来说,MATLAB超分辨率重构是一种有效的图像处理方法,可以将低分辨率图像重建为高分辨率图像。尽管存在一些限制和挑战,但通过选择合适的算法和参数设置,可以在很大程度上提高图像的质量和细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HenrySmale

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值