You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:10