python 二维码+图像处理

Emmmmm...最近学的东西有点杂 不管了 先记录下

0x01 二维码

关于二维码的生成,python的生成方式及其简单粗暴,只需要调用qrcode库即可。先放下代码。

import qrcode
import os

def create_qr(self, url, qrcodename):
    qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.ERROR_CORRECT_H,
    box_size=10,  # pixel of each box
    border=1,  # round blocks

    )

    qr.add_data(url)
    qr.make(fit=True)

    img = qr.make_image()
    img = img.convert("1")

    img.show()
    img.save(os.getcwd() + '/' + qrcodename + '.png', quality=100)

解释下上面在创建二维码的过程中的参数:

version:代表二维码的版本,有1-40,随着版本的升高,二维码所能存储的信息也越多,二维码也越大,version1为 270x270

error_correction:二维码的容错等级,有L、M、Q、H,等级依次升高,容错率也越来越高,所占用的字节数也越来越高

box_size:即每个格子所包含的像素数,默认为10

border:二维码边缘的包含几个格子,即生成二维码后的白边宽度

python 二维码+图像处理

关于具体的信息结构可以参照上图。

由于python的库对二维码可以控制的变量过少,不能控制其中的编码信息,在网上查找以后以为有关于二维码的编码代码,想要实现细节的更改二维码(例如改变其中的几个比特)几乎只能自己绘制二维码,但编程极为复杂。

思考后,发现了如下的方式。由于我们只想更改其中的几位,我们可以利用python对生成好的二维码进行处理,手动涂黑其中的白块,实现编码。具体如下所示:

python 二维码+图像处理

对于红线划分出来的格子即代表着0和1,我们可以通过改变其颜色来改变其代表的含义。

在更改的过程中,我们就需要用到了python的图像处理。(自己画的红线,丑点见谅= =)

 

0x02 图像处理

目前python有的图像处理库主要为一下几种:opencv, PIL, matplotlib

种类繁多,其中PIL是一些基本库,想要对图像进一步处理可以考虑opencv或者matplotlib

关于PIL的详细函数可以参照:https://blog.****.net/zhangziju/article/details/79123275

本次主要用到了其中的几个类来进行处理。

首先读取二维码:
 

def read_qr(self, path):
    im = Image.open(path)
    pix = im.load()

im为图像的对象,pix中存储的是该图像的数组。其中 pix[x, y] 代表的就是坐标(x,y)上的颜色值。由于二维码只有黑色和白色,所以其值只有255和0两种。

接下来对其中的块进行上色:

def find_block(x, y, pix):
    for i in range(10):
        for j in range(10):
            pix[x + i, y + j] = not pix[x + i, y + j]

由于我们生成时每个格子是10像素,所以我们需要将以(x,y)为左上定点的格子的像素进行变换,这里我对其进行了反转变换,即黑色变为白色或者白色变为黑色。

效果如下图所示:
python 二维码+图像处理

我们可以利用opencv的异或函数对这两幅图进行异或处理,看出其中的不同,代码如下:

import os
import cv2

def find_difference():
    handle_paths = []
    src_paths = []

    for i in range(4):
        path1 = os.getcwd() + '/' + 'handled' + str(i) + '.png'   # 处理后的二维码
        path2 = os.getcwd() + '/' + 'src' + str(i) + '.png'       # 原始二维码
        handle_paths.append(path1)
        src_paths.append(path2)

    for i in range(4):
        src = cv2.imread('./src' + str(i) + '.png')
        handle = cv2.imread('./handled' + str(i) + '.png')

        bitwiseXor = cv2.bitwise_xor(src, handle)    # 异或函数

        cv2.namedWindow('img')
        cv2.imshow('img', bitwiseXor)
        cv2.waitKey()
        cv2.destroyAllWindows()
        cv2.imwrite('xor' + str(i) + '.png', bitwiseXor)

效果如下:

python 二维码+图像处理

对二维码的图像处理到此就结束了。