还在为水印烦恼,Python帮你搞定

image-20230226103116484

还在为水印烦恼,Python帮你搞定

一. 个人需求

​ 我网盘里面有很多图片,大部分是从今日头条、小红书下载下来并加了水印的,水印大多出现在左下角或右下角。在发表头条文章时,需要引用这些图片,但是由于水印的存在,都会让人觉得不太舒服,所以我每次都会花时间用ps处理一下。由于我有一点Python 的开发知识,我就想着是否可以利用Python编写一个脚本去批量去除这些水印呢?因此我开始研究python批量去除水印的方法。

​ 这个是个人的需求, 暂未考量做成功能

二. 初步期望

  • 我将需要使用的图片复制到一个统一的目录下(图片估计有1万多张), 目录名称: watermark_src
  • 在cmd终端窗口中运行一个命令( python rm_wm.py ), 将上面这个目录下的所有图片自动检测并去除水印
  • 自动将这些去除水印的图片保存到一个目录下面: watermark_remove

三. 方法预研究

我从网上收集学习去水印的方法, 总结下来有下面几种:

1- 直接用数学计算的方法去除

2- 用深度学习的算法去除

3- 借助OpenCV工具+数学方法去除

我目前没有GPU啊, 还是只有用CPU了, 所以我觉得用OpenCV的方式可能要成本更低

我还听说有用FFMpeg去除水印的方式, 待会问问ChatGPT或者bing吧. (我现在用百度越来越少了啊...... 除了百度网盘); 好像是专门用来去视频文件的水印的, 不适用图片的水印去除.

学习资源:

Python如何批量去除图片上的LOGO(针对LOGO色素不复杂情况)_peng_wei_kang的博客-CSDN博客_python图像去除人工标记

Python批量图片去水印,提高工作效率 - chingho - 博客园 (cnblogs.com)

使用深度学习去除复杂图像水印,效果好过photoshop! - 知乎 (zhihu.com)

python 利用opencv去除图片水印 - yyxxff - 博客园 (cnblogs.com)

预研究之后, 我觉得目前我成本最低的方式 (肯定不是最好, 最好的方式还是全部使用深度学习的解决方法) : 💩

思路一: 深度学习的方式

1- 人工: 根据水印情况, 做一些特征的水印模板图片(mask)

2- 程序自动判断图片(四个角落上)是否有水印 🐸

3- 程序根据图片的尺寸和水印所在的位置, 使用mask去除水印

我可以将水印的情况做成相同的模板, 但是问题来了, 如何程序如何自动识别出水印所在的位置呢?? 还是要用的深度学习的方法

Github上有一个开源项目: rohitrango/automatic-watermark-detection: Project for Digital Image Processing (github.com)

折腾了半天, 阅读源码发现这玩意需要 一定的环境啊

ChatGPT说:

如果你的 Python 是 32 位版本的,那么 TensorFlow 不会直接支持。TensorFlow 官方只支持 64 位版本的 Python。不过,你可以考虑使用一些非官方的 TensorFlow 发行版,比如 TensorFlow for 32-bit Windows,该版本可以在 32 位版本的 Python 上运行。你可以访问该发行版的官方网站(https://github.com/fo40225/tensorflow-windows-wheel)来获取更多信息和安装说明。但需要注意的是,非官方的 TensorFlow 发行版可能会存在稳定性和兼容性方面的问题。如果你需要使用 TensorFlow 进行重要的项目开发,建议使用官方支持的 64 位版本的 Python。

思路二: 借助OpenCV工具+数学方法去除

图片文件(jpg/jpeg/png)的特征:

1- 图片要么横版/要么竖版 (宽>高 就是横版; 宽<高 就是竖版);

2- 我们假设所有的logo水印都在图片的上眉和下眉的左中右三个位置的其中一个

图片中的logo都是 文字形状, 如@今日头条之类的

​ [人工]可以事先用PS工具 提取出这些logo上的颜色值🔴 ; 并写好到json文件中; 例如:

# logo类型的颜色值
{
    "logo1":{
        "logotitle": "今日头条"
        "temp_file": "logo_temp1.jpg",
        "logo_location": {
            "left_top": "true" # 上眉有left_top / top_center/ right_top; 下眉有right_bott / bott_center / right_bott
            "box": "left_top_x, left_top_y, right_bott_x, right_bott_y" # 这是左上角和右下角的位置
        },

        "rgb_color_1": "200,200,200",
        "rgb_color_2": "...",
        "rgc_color_3": "..."
    },
    "logo2":{
        .....
    }
}

3- 所有图片中的logo水印一般不多,不会超过20种

4- [人工] 有logo水印的图片我们全部集中放在一个目录下面, 这个目录下面再按不同的logo类型再划分目录

(目前还做不到,将所有不同logo类型的图片放在一个目录下面批量处理, 后面想了一个特殊的方法)

5- 单张图片的logo去除方法:

用Python + OpenCV三步去除水印,去水印需要使用的库:cv2、numpy。cv2是基于OpenCV的图像处理库,可以对图像进行腐蚀,膨胀等操作;numpy这是一个强大的处理矩阵和维度运算的库

图片去水印原理 1、标定噪声的特征,使用cv2.inRange二值化标识噪声对图片进行二值化处理,具体代码:cv2.inRange(img, np.array([200, 200, 240]), np.array([255, 255, 255])),把[200, 200, 200]~[255, 255, 255]以外的颜色处理为0; 2、使用OpenCV的dilate方法,扩展特征的区域,优化图片处理效果; 3、使用inpaint方法,把噪声的mask作为参数,推理并修复图片。

去掉图片右下角的水印步骤 1、从源图片,截取右下角部分,另存为新图片; 2、识别水印,颜色值为:从json文件中获得 3、去掉水印,还原图片; 4、把源图片、去掉水印的新图片,进行重叠合并;

如何识别不同的logo类型呢(这样就不需要人工对图片分类,分目录了, 也就是取代上面的第四步人工操作了)

思路: 采用OCR文字识别后再比对 (哈哈哈, 我真实一个小机灵 🐶 )

1- 裁减图片的上眉 和 下眉图片 ; 上眉和下眉高度都不会超过100;

2- 对上眉和下眉图片采用 用ocr识别文字

3- 用文字找到对应的 logo 类型,

采用百度飞浆的OCR包

安装:

可以先阅读: 避坑教程:最新百度PaddleOCR文字识别成功下载安装保姆级手把手教程 - 知乎 (zhihu.com)

# 先安装wheel (可以在系统上全局安装,也可以在虚拟环境上安装)
pipenv install wheel
# 建议使用whl下载安装 shapely
# http://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely

python -m pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
pipenv install paddleocr -i 

# For windows users: If you getting this error OSError: [WinError 126] The specified module could not be found when you install shapely on windows. Please try to download Shapely whl file here.

模型选择:

PaddleOCR/README_ch.md at release/2.6 · PaddlePaddle/PaddleOCR (github.com)

使用:

可以看看代码示例, 官方文档paddleocr · PyPI

PaddleOCR 文本检测实战 - 掘金 (juejin.cn)

学习: 弄懂图像的坐标系 / 宽高的基本属性

image-20230228140026633

​ 请仔细阅读: 究极清晰!一文带你看懂OpenCV中的坐标系与图像通道顺序 - 知乎 (zhihu.com)

关于CV2 图像开发的理解

使用OpenCV和Python实现图像的颜色检测_opencv颜色的准确性_W_Tortoise的博客-CSDN博客

通过实验终于可以理解cv2 图像二值化的意思了, 二值化实际上是将图片转换为 黑白两种色彩. 转换的条件就是通过颜色值的上限 / 下限来处理.

而颜色的上限/ 下限的意思就是, BGR 三个数值的合值;

image-20230301201000733

image-20230301201039034

日常运行过程: (For Windows)

( 🐛 运营人员使用, 暂未考虑工具产品化; 需要使用人员对python开发有一定的了解, 至少安装环境是必须掌握的 )

🙏个人PC(或者服务器)上 请事先 安装好Python3 及相关的包环境(numpy / cv2 / PIL); 强烈建议是在Python的虚拟环境中安装

  • 1- 将python项目目录复制到指定位置, 并对这个位置建立虚拟环境 ( 在CMD终端窗口中执行 pipenv install ),
  • (待补充 目录结构)
  • 2- 线下手工用PS工具 提取出这些logo上的颜色值🔴 ; 并写好到json文件(static/logo_temp.json)中, JSON文件的格式参考上面
  • 3- 将要处理的图片复制到 待处理的目录( static/images/img_src / <当天> ) 中;
  • 4- 执行命令行程序 python rm_wm.py 清除logo水印
  • 5- 检查清除logo效果, 请打开清除后的文件目录 (static/images/img_new/ <当天>) 检查新生成的图片

上面是第一次使用过程, 后续每次增加一种新的logo去图片时, 请先维护JSON文件

如果后不需要增加新的logo时, 其实只需要执行两步就可以了; 1- 复制源图片; 2- 执行命令

小结

1- 根据上面的思路二进行实现

2- 整个过程中人工只需要将图片中的logo类型在JSON文件 先标识好就可以了 (后续可以使用JQuery在前端页面上实现截图,定位,取色值, 并记录到JSON中)

好累:休息休息!!!

image-20230226200434247

四. 开发实现

4.1. 环境安装

开发环境:

第一次进行开发时, 需要开发人员自行安装, 我的开发环境 Windows 10 + VSCODE

建立虚拟环境:

# 1-创建虚拟环境
pipenv install
# 2-设置全局Python 路径
# 请在pipenv的虚拟环境目录(Scripts)中的 activer.bat 文件末尾加上一句, 把你的python全局包目录加上去, C:\Python38\Lib\site-packages是我的python包路径
@set PYTHONPATH=%PYTHONPATH%;C:\Python38\Lib\site-packages

# 3-设置 pipenv 的 国内镜像, 修改pipfile
[[source]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
verify_ssl = true
name = "pip_conf_index_global"

# 4-升级一下虚拟环境中的pip 版本, 一定注意要与系统中pip版本保持一致
pipenv run python -m pip install --upgrade pip

安装第三方软件包

# 5-开发运行时, 第三方包安装
pipenv install moment pillow wheel
pipenv install numpy
pipenv install opencv-python

安装百度飞浆OCR

# 6- 建议使用whl下载安装 shapely
# whl 包已经 下载放置在项目 install-package 目录中(我的环境是python 3.8 32bit) : 
# http://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely
pipenv install shapely

# 7- 这个是在虚拟环境中安装
pipenv install paddlepaddle
pipenv install paddleocr

# 这是在全局系统中安装, 如果是全局系统中安装的飞浆, 并且想在虚拟环境中使用, 请在pipenv的虚拟环境目录(Scripts)中的 activer.bat 文件末尾加上一句, 把你的python包目录加上去
@set PYTHONPATH=%PYTHONPATH%;C:\Python38\Lib\site-packages
python -m pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple

# For windows users: If you getting this error OSError: [WinError 126] The specified module could not be found when you install shapely on windows. Please try to download Shapely whl file here.

如果是在VSCODE中开发, 请在设置中加上你的本地系统的包路径

要让 VS Code 找到你设置的虚拟环境中的包和系统已安装的包,你需要在 VS Code 中进行一些配置。

  1. 首先,打开 VS Code 并进入你的 Python 项目。
  2. 然后,按下 "Ctrl+Shift+P" (Windows) 或 "Cmd+Shift+P" (Mac) 打开命令面板,输入 "Python: Select Interpreter" 并选择你设置的虚拟环境。
  3. 接下来,你需要在 VS Code 中配置你的 Python 路径。点击左下角的齿轮图标打开设置,然后搜索 "python.pythonPath"。将其设置为你想要使用的 Python 解释器路径,这个路径应该是你虚拟环境中的 Python 解释器路径。
  4. 如果你想让 VS Code 找到你系统已经安装的包,你可以在 VS Code 中添加 Python 解释器路径和系统安装的包路径。在设置中搜索 "python.autoComplete.extraPaths" 并添加你想要添加的路径。例如,如果你的系统安装的包路径为 "/usr/local/lib/python3.9/site-packages",你可以将 "python.autoComplete.extraPaths" 设置为 ["/usr/local/lib/python3.9/site-packages"]。
  5. 最后,你需要重新启动 VS Code 以使配置生效。现在,你应该可以在 VS Code 中找到你设置的虚拟环境中的包和系统已安装的包了。

好吧, 开始享受代码吧

运行环境

如果是在运营时只需在项目目录下面运行一行命令即可, 如果提示百度飞浆OCR安装失败则需要参考上面的过程, 手工单独安装飞浆的OCR

pipenv install

4.2. 程序结构说明

# windows 生成目录树的命令
tree . /f > tree.txt

RM_WM 
│  Pipfile
│  Pipfile.lock
│  Readme.md
│  rm_wm.py # 程序入口
│  
├─common # 内部程序
│      logo_ocr.py # ocr识别 logo
│      main.py # 组织程序
│      wm_action.py # 水印处理程序
│      wm_check.py # 水印检查程序
│      __init__.py
│      
├─conf
│      config.py # 程序参数配置
│      __init__.py
│      
├─install-package
│      Shapely-1.8.2-cp38-cp38-win32.whl
│      
├─static
│  └─images
│      ├─img_new # 按日期存放去除logo水印的目录
│      ├─img_src # 原始图片目录
│      ├─img_temp # 处理过程中的临时目录
│      └─logo_json # logo样本目录
│              logo_temp.json
│              
└─templates # 暂时无用

4.2.1 测试代码

测试paddleocr

4.2.2 辅助功能

用 Python + CV2 实现下面功能: 图片颜色拾取和图片区域坐标显示

期望操作步骤:

1- 在CV2 窗口中打开一个图片,

​ 窗口分成左右两部分, 左边是图片区域, 右边是信息显示区域(占20%),

​ 信息显示区域中的文字是可以复制的

2- 鼠标在图片上点击, 信息显示区域上显示点击的像素的坐标, 颜色(BGR 和 HSV)

3- 鼠标按住-->移动-->松开操作, 信息显示区域上显示这次操作的鼠标按住时的坐标和松开时的坐标

请帮忙用 Python + CV2 实现, 如果还另外需要其他第三方库, 你也可以自行选择.

附录,

我想做一个页面功能, 我在前端页面上放一个Canvas, 在Canvas上进行操作, 然后,希望将这个Canvas图像传递到服务器端保存为一张图片, 使用的相关技术:

前端: Bootstrap5 + Canvas + FormData + Jquery3.6 + Ajax

后端: Flask 2.2

前端代码样例

<canvas id="cvs002"></canvas>
<button type="button" class="btn btn-outline-secondary mt-2 mb-3 ml-5" onclick="javascript:uploadFile();">保存蒙版</button>

请你帮忙补充前后端相关代码.

image-20230226103424389


作者: CLP ; 日期: 2023-2-26 ; 地点: 临沂; 天气: 晴

QQ: 53258372; Mail : 53258372@QQ.com

微信: image-20220903114619121