前言
上篇文章讲了去除水印的第一种方式,下面介绍去除水印的第二种方式,手动定位水印位子+修复神经网络
老规矩先上效果图,以免浪费大家时间:
左图是原图,随便从网上下载一张,后面是处理完的效果图。
项目位置及运行环境安装
项目地址:https://github.com/Picsart-AI-Research/MI-GAN
这个项目的优点在于对配置要求低,且支持cpu推理,框架是pytorch,对pytorch熟悉的朋友可以按照官方步骤来安装环境。
我这里没有按照官方步骤安装,因为官方步骤是gpu的安装方式,下面是cpu的安装方式。
1.下载项目
git clone https://github.com/Picsart-AI-Research/MI-GAN.git
2.win+R进入cmd,创建conda环境
conda create -n mi-gan python=3.9
conda activate mi-gan
3.注释掉requirements.txt里面的PyTorch加速库
4.安装pytorch和其他依赖
cd MI-GAN
pip install -r requirements.txt
5.获得模板图片
代码:
#include <opencv2/opencv.hpp>
cv::Mat image; // 原始图像
cv::Mat mask; // 掩码
bool drawing = false; // 标志,表示是否正在绘制
cv::Point pt1, pt2; // 矩形的两个端点
// 鼠标回调函数
void mouseCallback(int event, int x, int y, int flags, void* userdata)
{
// 鼠标左键按下时,开始绘制
if (event == cv::EVENT_LBUTTONDOWN)
{
drawing = true;
pt1 = cv::Point(x, y); // 记录鼠标按下的位置
}
// 鼠标左键释放时,结束绘制
else if (event == cv::EVENT_LBUTTONUP)
{
drawing = false;
pt2 = cv::Point(x, y); // 记录鼠标松开的位置
// 在掩码上画矩形
cv::rectangle(mask, pt1, pt2, cv::Scalar(255), -1); // 画一个填充的矩形(白色区域)
}
// 鼠标移动时,如果正在绘制,则继续更新矩形的大小
else if (event == cv::EVENT_MOUSEMOVE)
{
if (drawing)
{
pt2 = cv::Point(x, y);
// 每次鼠标移动时,刷新显示
cv::Mat temp_image = image.clone();
cv::rectangle(temp_image, pt1, pt2, cv::Scalar(0, 255, 0), 2); // 绘制实时矩形框
cv::imshow("Image with Mask", temp_image); // 显示图像
}
}
}
int main()
{
// 1. 读取图像
image = cv::imread("F:/Desktop/6915.jpg_wh860.jpg");
if (image.empty())
{
std::cerr << "Error loading image!" << std::endl;
return -1;
}
// 2. 创建一个掩码,初始化为黑色(全 0)
mask = cv::Mat::zeros(image.size(), CV_8UC1);
// 3. 设置鼠标回调函数
cv::namedWindow("Image with Mask", cv::WINDOW_NORMAL);
cv::setMouseCallback("Image with Mask", mouseCallback, nullptr);
// 4. 显示图像,并通过鼠标绘制
while (true)
{
// 仅显示原始图像并在掩码上绘制
cv::Mat temp_image = image.clone();
cv::Mat temp_mask = mask.clone();
// 将掩码区域显示在图像上
temp_image.setTo(cv::Scalar(0, 255, 0), temp_mask); // 使用掩码(绿色高亮显示)
cv::imshow("Image with Mask", temp_image); // 显示图像
char c = (char)cv::waitKey(1); // 等待按键
if (c == 27)
{ // 按下ESC退出
break;
}
}
// 最终显示掩码
cv::imshow("Final Mask", mask);
cv::imwrite("F:/Desktop/6915.jpg_wh860.png", mask);
cv::waitKey(0);
return 0;
}
这里通过opencv将有水印的(想消除的)地方圈起来,得到模板图片,并放入MI-GAN目录底下如图所示:
这里注意,名称要与要处理的名称一致。
6.运行代码
cd scripts
python demo.py --model-name comodgan-512 --model-path ../model/comodgan_512_places2.pt \
--images-dir ../examples/places2_512_object/images \
--masks-dir ../examples/places2_512_object/masks \
--output-dir ../examples/places2_512_object/results/migan/ --device cpu --invert-mask
输出图片去examples/places2_512_object/results/migan/目录底下去找。
总结
随着对修复神经网络认识的逐渐加深,我意识到图像修复神经网络不止有去除水印一种功能,还有许多其他功能,去除瑕疵,移除场景物品、人物等,后续可能会出一些其他用法的文章。