目录
1.功能概述
2.具体实现
2.1.导入OpenCV库和头文件
2.2.读入图像并显示
2.3.提取水印区域
2.4.重构去除水印后的图像
3.完整代码如下
4.实现效果
5.介绍几种PS去水印的方法
5.1.裁剪法
5.2.借图法
5.3.内容识别填充
5.4.消失点法
5.5.拉伸法
1.功能概述
实现图片去水印的方法有很多,下面提供一种基于OpenCV库的C++实现方法。主要思路是利用图像中不同水印区域之间的差异,进行区域提取、重构和合成,从而实现去除水印的效果。
2.具体实现
2.1.导入OpenCV库和头文件
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
2.2.读入图像并显示
//读入图像
Mat image = imread("test.jpg", IMREAD_UNCHANGED);
if (image.empty()) {
cout << "读取图像失败!" << endl;
return -1;
}
//显示图像
imshow("原始图像", image);
waitKey(0);
2.3.提取水印区域
//转换为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
//二值化处理
Mat binary;
threshold(gray, binary, 50, 255, THRESH_BINARY);
//形态学操作,提取水印区域
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
//显示水印区域
imshow("水印区域", binary);
waitKey(0);
2.4.重构去除水印后的图像
//创建空白图像
Mat result = Mat::zeros(image.size(), image.type());
//利用原始图像和水印区域进行重构
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
if (binary.at<uchar>(i, j) == 0) {
result.at<Vec3b>(i, j) = image.at<Vec3b>(i, j);
}
}
}
//显示去除水印后的图像
imshow("去除水印后的图像", result);
waitKey(0);
3.完整代码如下
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
//读入图像
Mat image = imread("test.jpg", IMREAD_UNCHANGED);
if (image.empty()) {
cout << "读取图像失败!" << endl;
return -1;
}
//显示图像
imshow("原始图像", image);
waitKey(0);
//转换为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
//二值化处理
Mat binary;
threshold(gray, binary, 50, 255, THRESH_BINARY);
//形态学操作,提取水印区域
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
//显示水印区域
imshow("水印区域", binary);
waitKey(0);
//创建空白图像
Mat result = Mat::zeros(image.size(), image.type());
//利用原始图像和水印区域进行重构
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
if (binary.at<uchar>(i, j) == 0) {
result.at<Vec3b>(i, j) = image.at<Vec3b>(i, j);
}
}
}
//显示去除水印后的图像
imshow("去除水印后的图像", result);
waitKey(0);
return 0;
}
4.实现效果
待更新。。。
5.介绍几种PS去水印的方法
平时我们在使用一些图片素材时,图片上都会带有各种水印,水印的目的主要是版权保护以及宣传作用等,但是带水印的图片会影响观看体验,所以今天就给大家分享几个利用ps去除水印的方法。
5.1.裁剪法
裁剪法去水印主要应用的对象是,水印在图片的四周,裁剪处理后不会影响图片整体的效果。
步骤如下:
1 将图片在ps软件打开
2 在工具组选择裁剪工具,将有水印的部位裁剪掉即可。
裁剪完成后,鼠标在图片任一区域双击或者按回车键可以退出裁剪状态
5.2.借图法
借图法是借用水印周围相似的区域覆盖水印,达到去除水印的目的,用到的工具有修复画笔工具或者仿制图章工具,这两个工具的操作方法基本一样,首先按住Alt键,鼠标在和要处理区域相似且没有水印的地方单击一下(解释一下,这一步的目的是取样,就是用取样地方的图像覆盖有水印的地方,完成去除水印的效果),然后在有水印的地方慢慢涂抹就可以(根据水印的大小调整画笔的大小和硬度更好的处理水印)
5.3.内容识别填充
ps中的内容识别填充功能很强大,我们首先需要利用选区工具选中有水印或者瑕疵(比如痘印等)区域,然后按快捷键shift+F5或者单击【编辑】——【内容识别填充】,软件会自动完成水印或者瑕疵去除。它的原理是:当我们选择好要处理的区域后,软件就会自动分析周围图像的特点,将图像进行拼接组合后填充在该区域并进行融合,从而达到快速无缝的拼接效果
步骤如下:
1 先将要处理的区域选择出来 (注意:选的时候,只需把要处理的区域选择完整就行,不要选择过大的区域,会影响内容识别填充后的效果)
2 利用内容识别填充去处理时,使用快捷键时会弹出下面的对话框,参数直接默认,单击确定;在编辑菜单下,选择内容识别填充时也会弹出一个对话框,参数默认,直接单击确定
下面我用两个例子给大家看一下内容识别填充的处理效果,第一个是去除脸部的痘痘,第二个是去除头发上的文字水印
5.4.消失点法
消失点法使用对象是有明显透视效果图像上的水印,利用滤镜菜单下的消失点可以使图像处理后保持透视效果。
步骤如下:
打开图片后,单击【滤镜】——【消失点】,打开消失点工具后,首先利用左侧工具栏的创建平面工具,在图片中没有水印的地方画一个区域,接着利用选框工具在绘制好的区域画个选区,最后按住Alt+shift键(alt键加鼠标移动表示复制,shift键表示垂直移动)移动没有水印的区域来覆盖有水印的区域
5.5.拉伸法
拉伸法是利用ps中的自由变换功能,直接将水印附近的背景进行拉伸以覆盖水印,适合去除图片背景为纯色或者颜色不复杂渐变填充的水印。
步骤如下:
首先利用矩形选区工具,在图片没有水印的地方绘制一个区域,然后打开自由变换(快捷键ctrl+T或者单击【编辑】——【自由变换】),按住shift键拖动矩形区域,直至将水印完全覆盖。应用完自由变换后,鼠标在任意区域双击或者按回车可以退出自由变换编辑状态