JIT
检测并处理目录下的webp图片二维码部分
win10系统,python,中文注释。 检测D:\img\img目录下和子目录下所有.webp图片,是否包含二维码,如果包含二维码,则把图片的二维码部分打码,图片的其他部分不要动,修改后的图片覆盖原图片。不要用pyzbar

好的,这是一个使用 Python 和 OpenCV 库来检测并打码 .webp 图片中二维码的脚本。请注意,这个脚本需要在你的 Windows 10 系统上运行,并且需要安装相应的库。

由于 WebContainer 环境的限制(无法运行原生二进制文件),而 opencv-pythonPillow 库依赖于原生代码,因此这个脚本无法直接在 WebContainer 中运行。你需要将代码复制到你的本地 Windows 10 环境中执行。

首先,你需要安装所需的库:Pillow (用于图像处理) 和 opencv-python (用于二维码检测)。

bash pip install Pillow opencv-python numpy

然后,你可以使用下面的 Python 脚本。

使用方法:

  1. 将上面的代码保存为一个 .py 文件,例如 process_webp_qr.py
  2. 确保你已经安装了 Pillow, opencv-python, 和 numpy 库 (pip install Pillow opencv-python numpy)。
  3. 修改脚本中 root_dir 变量的值,将其设置为你要处理的图片所在的目录 (D:\img\img)。
  4. 打开命令提示符或 PowerShell,导航到你保存脚本的目录。
  5. 运行脚本:python process_webp_qr.py

脚本会遍历指定目录及其子目录下的所有 .webp 文件,检测二维码并进行打码,然后覆盖原文件。_

Updated files
v1
检测的精确一些,不要把草地识别为二维码。

好的,为了提高二维码检测的精确度,我们可以在检测到潜在区域后,增加一个简单的形状检查,例如检查检测到的区域的宽高比是否接近 1(因为二维码通常是正方形的)。这有助于过滤掉一些非正方形的误识别区域,比如某些纹理或线条。

我们将修改之前的脚本,加入这个宽高比的判断。

请注意,这个脚本仍然需要在你的本地 Windows 10 环境中运行,并且需要安装 Pillow, opencv-python, 和 numpy 库。

bash pip install Pillow opencv-python numpy

这是修改后的 Python 脚本:

使用方法:

  1. 将上面的代码保存为一个 .py 文件,例如 process_webp_qr_refined.py
  2. 确保你已经安装了 Pillow, opencv-python, 和 numpy 库 (pip install Pillow opencv-python numpy)。
  3. 修改脚本中 root_dir 变量的值,将其设置为你要处理的图片所在的目录 (D:\img\img)。
  4. 你可以根据需要调整 aspect_ratio_threshold_lowaspect_ratio_threshold_high 的值来放宽或收紧宽高比的判断。
  5. 打开命令提示符或 PowerShell,导航到你保存脚本的目录。
  6. 运行脚本:python process_webp_qr_refined.py

这个版本在 OpenCV 初步检测到区域后,会进一步检查该区域的宽高比。只有宽高比在设定的范围内,才会被认为是有效的二维码区域并进行打码。这应该能减少一些非正方形图案(如某些草地纹理)被误识别为二维码的情况。_

Updated files
v2
处理文件时发生错误 D:\img\img\0419\18624-20250419-5.webp: could not broadcast input array from shape (168,168,3) into shape (168,439,3)

好的,根据您提供的错误信息 could not broadcast input array from shape (168,168,3) into shape (168,439,3),这表明在尝试将像素化后的区域(形状为 (168, 168, 3))复制回原图时,目标区域的形状是 (168, 439, 3),两者宽度不匹配导致了广播错误。

这通常是因为在计算要打码的区域时,边界处理不够精确,导致实际切片区域的大小与用于生成像素化区域的大小不一致。

我将修正 pixelate_region 函数中的边界处理逻辑,确保提取 ROI、resize 以及将结果放回原图时使用的区域尺寸是完全一致的,并且正确处理区域超出图像边界的情况。

请使用以下更新后的脚本。同样,这个脚本需要在你的本地 Windows 10 环境中运行,并确保已安装所需的库。

bash pip install Pillow opencv-python numpy

这是修正边界处理逻辑后的 Python 脚本:

使用方法:

  1. 将上面的代码保存为一个 .py 文件,例如 process_webp_qr_boundary_fix.py
  2. 确保你已经安装了 Pillow, opencv-python, 和 numpy 库 (pip install Pillow opencv-python numpy)。
  3. 修改脚本中 root_dir 变量的值,将其设置为你要处理的图片所在的目录 (D:\img\img)。
  4. 你可以根据需要调整 aspect_ratio_threshold_lowaspect_ratio_threshold_high 的值来放宽或收紧宽高比的判断。
  5. 打开命令提示符或 PowerShell,导航到你保存脚本的目录。
  6. 运行脚本:python process_webp_qr_boundary_fix.py

这个版本应该能更稳定地处理靠近图像边缘的二维码区域,避免之前出现的尺寸不匹配错误。

Updated files
v3
当图片包含多个小的二维码 时,一个都没能识别出来?

好的,针对图片中包含多个小二维码难以识别的问题,我们可以尝试在二维码检测之前对图片进行一些预处理,以增强二维码的特征,使其更容易被检测器识别。

一种常用的预处理方法是自适应阈值化。它可以根据图像局部区域的像素值来计算阈值,将图像转换为二值图像,这有助于突出二维码的黑白模块结构。

我们将修改脚本,在调用 cv2.QRCodeDetector 之前,先将图片转换为灰度图并进行自适应阈值化。

请使用以下更新后的脚本。同样,这个脚本需要在你的本地 Windows 10 环境中运行,并确保已安装所需的库。

bash pip install Pillow opencv-python numpy

这是加入自适应阈值化预处理的 Python 脚本:

使用方法:

  1. 将上面的代码保存为一个 .py 文件,例如 process_webp_qr_thresholding.py
  2. 确保你已经安装了 Pillow, opencv-python, 和 numpy 库 (pip install Pillow opencv-python numpy)。
  3. 修改脚本中 root_dir 变量的值,将其设置为你要处理的图片所在的目录 (D:\img\img)。
  4. 你可以根据需要调整 aspect_ratio_threshold_lowaspect_ratio_threshold_high 的值来放宽或收紧宽高比的判断。
  5. 你还可以尝试调整 adaptive_thresh_block_sizeadaptive_thresh_C_value 这两个自适应阈值化的参数。
    • adaptive_thresh_block_size 越大,计算阈值的区域越大,对局部光照变化的适应性越强,但也可能模糊细节。
    • adaptive_thresh_C_value 越大,阈值越高,二值化后的前景(二维码模块)会越少,背景会越多。反之,C_value 越小,阈值越低,前景会越多,背景会越少。
    • 尝试不同的组合,看看哪组参数对你的图片效果最好。
  6. 打开命令提示符或 PowerShell,导航到你保存脚本的目录。
  7. 运行脚本:python process_webp_qr_thresholding.py

通过在阈值化后的二值图像上进行检测,二维码的黑白模式会更加清晰,这有助于 OpenCV 的检测器更好地找到它们,特别是对于一些对比度不高或背景复杂的图片中的小二维码。*

Updated files
v4