python
import os
import cv2
import numpy as np
import qrcode
FOLDER = 'qr_dataset'
if not os.path.isdir(FOLDER):
os.mkdir(FOLDER)
for data in np.random.choice(np.arange(1000, 10000), size=2500, replace=False):
for version in [1, 2, 3, 4]:
qr = qrcode.QRCode(
version=version,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=4
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color='black', back_color='white')
img = np.float32(np.asarray(img)) * 255
img = np.dstack((img, img, img))
cv2.imwrite(os.path.join(FOLDER, f"{data}-v{version}.png"), img)
- 数据集增强处理
sing-srgan-for-qr-code-enhancement 用到的增强操作如下:
c
datagen = ImageDataGenerator(
rotation_range = 40,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
brightness_range = (0.5, 1.5))
可结合上面操作,设计增强操作,比如
python
# 1. 旋转
angle = np.random.uniform(-15, 15)
degraded = rotate_image(degraded, angle)
# 2. 失焦模糊
blur_radius = np.random.uniform(2.0, 5.0)
degraded = cv2.GaussianBlur(degraded, (0, 0), sigmaX=blur_radius, sigmaY=blur_radius)
# 3. 运动模糊
if np.random.rand() > 0.5:
ksize = np.random.choice([9, 15, 21])
degraded = apply_motion_blur(degraded, kernel_size=ksize)
# 4. 下采样
scale = np.random.uniform(0.15, 0.4)
h, w = degraded.shape
small = cv2.resize(degraded, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_AREA)
degraded = cv2.resize(small, (w, h), interpolation=cv2.INTER_LINEAR)
# 5. JPEG 压缩
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), np.random.randint(10, 40)]
_, encimg = cv2.imencode('.jpg', degraded, encode_param)
degraded = cv2.imdecode(encimg, 0)
# 6. 噪声
noise = np.random.normal(0, np.random.uniform(10, 30), degraded.shape)
degraded = np.clip(degraded + noise, 0, 255).astype(np.uint8)