如何用Python仅模糊图像中的二维码?现有代码误模糊其他区域
解决二维码误模糊非二维码区域的方案
问题根源
原代码的核心问题是:检测到二维码后,没有利用pyzbar返回的精准位置信息,反而全局提取轮廓并模糊所有符合面积阈值的区域,导致任何深色大区域都会被误判为二维码区域进行模糊。
修正思路
直接使用pyzbar解码后返回的二维码边界框坐标,精准定位二维码区域,只对该区域执行模糊操作,完全跳过冗余的全局轮廓检测步骤。
修正后的代码
import cv2 import pyzbar.pyzbar as pyzbar import secrets import os import numpy as np from cv2 import Mat def blur_qrcode(path, image: Mat): # 仅检测图像中的二维码 qrcodes = pyzbar.decode(image=image, symbols=[pyzbar.ZBarSymbol.QRCODE]) if qrcodes: for qrcode in qrcodes: # 获取二维码的边界框坐标 x, y, w, h = qrcode.rect # 校验坐标,防止超出图像范围 x = max(0, x) y = max(0, y) x_end = min(image.shape[1], x + w) y_end = min(image.shape[0], y + h) # 提取并模糊二维码区域 qrcode_area = image[y:y_end, x:x_end] blurred_area = cv2.GaussianBlur(qrcode_area, (25, 25), 0) # 将模糊区域放回原图像 image[y:y_end, x:x_end] = blurred_area # 保存处理后的图像 file_name = secrets.token_hex(8) + '_blurred.png' full_path = os.path.join(path, file_name) return full_path if cv2.imwrite(full_path, image) else '' else: return 'no_qrcode'
关键改进点
- 精准定位:直接复用pyzbar的检测结果,避免全局轮廓检测带来的误判
- 边界校验:添加坐标范围限制,防止二维码靠近图像边缘时出现索引错误
- 简化流程:移除冗余的阈值分割、二次轮廓提取步骤,减少计算量和出错概率
进阶优化(精准模糊二维码内容)
如果需要只模糊二维码的实际内容而非整个边界框,可以利用pyzbar返回的多边形顶点生成掩码:
def blur_qrcode_with_mask(path, image: Mat): qrcodes = pyzbar.decode(image=image, symbols=[pyzbar.ZBarSymbol.QRCODE]) if qrcodes: for qrcode in qrcodes: # 获取二维码的多边形顶点 points = qrcode.polygon pts = np.array(points, np.int32).reshape((-1, 1, 2)) # 创建掩码,仅覆盖二维码区域 mask = np.zeros(image.shape[:2], dtype=np.uint8) cv2.fillPoly(mask, [pts], 255) # 模糊整个图像后,通过掩码替换二维码区域 blurred_image = cv2.GaussianBlur(image, (25, 25), 0) image = np.where(mask[..., None] == 255, blurred_image, image) file_name = secrets.token_hex(8) + '_blurred.png' full_path = os.path.join(path, file_name) return full_path if cv2.imwrite(full_path, image) else '' else: return 'no_qrcode'
内容的提问来源于stack exchange,提问作者Geovanii Amaral
相关产品推荐
相关产品推荐

