第一课:使用C++实现图片去水印

2023-10-31

目录

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键拖动矩形区域,直至将水印完全覆盖。应用完自由变换后,鼠标在任意区域双击或者按回车可以退出自由变换编辑状态

动图封面

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一课:使用C++实现图片去水印 的相关文章

  • C++ OpenCV 2.3 中缺少 MoveWindow()

    我正在使用 OpenCV 2 3 的 C 版本 并且正在努力完成一项基本任务 我想做的是创建一个窗口并将其移动到屏幕上的特定位置 例如使用 cv namedWindow My Window 1 cv MoveWindow My Window
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • 如何在给定目标大小的情况下在 python 中调整图像大小,同时保留纵横比?

    首先 我觉得这是一个愚蠢的问题 对此感到抱歉 目前 我发现计算最佳缩放因子 目标像素数的最佳宽度和高度 同时保留纵横比 的最准确方法是迭代并选择最佳缩放因子 但是必须有更好的方法来做到这一点 一个例子 import cv2 numpy as
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 我可以使用 openCV 比较两张不同图像上的两张脸吗?

    我对 openCV 很陌生 我看到它可以计算出脸部并返回一个矩形来指示脸部 我想知道 openCV 是否可以访问两张包含一张脸的图像 并且我希望 openCV 返回这两个人是否相同的可能性 Thanks OpenCV 不提供完整的人脸识别引
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • OpenCV 错误:connectedComponents_sub1 中断言失败 (L.channels() == 1 && I.channels() == 1) [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 OpenCV python 中遇到以下错误 并用 google 搜索了很多 但无法解决 如果有人能为我提供一些线索
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here

随机推荐

  • 根据E-R图设计数据库表

    上图是一个E R图 一共有三个实体 司机 车辆 车队 并且这几个实体之间互相具有一定的联系 我们首先把所有实体的表写出来 数据类型的选择请参考文章 https blog csdn net qq 61659383 article detail
  • 最完整梳理:SSL证书的诞生和历史

    HTTPS加密已经成为主流的网络传输协议 但是 SSL证书的诞生和历史你了解吗 跟着本文一起了解一下SSL证书的进化史 SSL TLS协议进化史 SSL协议 Secure Sockets Layer 安全套接层 是一套网络通信安全协议 具有
  • Nginx(二十一)nginx配置python

    一 scgi wsgi uwsgi 1 scgi gt 了解 SCGI是一种 与语言无关 的连接 web服务器 和 web应用程序 的方法 2 wsgi gt 协议 wsgi 一种 实现python解析 的通用 接口标准 协议 实现了 py
  • nginx的简单介绍 什么是nginx,为什么使用nginx,nginx的优点

    一 什么是nginx 1 Nginx是一款轻量级的Web 服务器 反向代理服务器及电子邮件 IMAP POP3 代理服务器 在BSD like 协议下发行 其特点是占有内存少 并发能力强 事实上nginx的并发能力在同类型的网页服务器中表现
  • Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆 stack是栈 是两种不同的数据结构 堆是队列优先 先进先出 栈是先进后出 在java多线程中 每个线程都有自己的栈 不同的线程共享一个堆 在java内存中 栈中存放的大
  • 国庆在家写了个简易版的在线简历网站

    一个可在线编辑的简历页面 放在github Page上托管 在线编辑 可生成PDF 从此跑路没烦恼 目录 一 GitHub Page托管简历 二 修改简历 三 简历下载 一 GitHub Page托管 1 页面样式 这个简历单纯页面技术含量
  • tcpclient和tcplistener通信

    服务器和客户端的代码都在在vs中编写并运行的 功能上实现了一个客户端和服务器互发消息 如果哪位大神知道多个客户端怎么搞 请留个思路给我 感谢 服务器的代码 using System using System Collections Gene
  • Git commit格式 详解

    我们在使用git进行版本控制的时候 commit的格式是有要求的 我们可以先去看一些顶级项目他们的commit的格式是怎样的 angular在github上的commit信息 我们可以发现 commit都有一些前缀 比如说 feat tes
  • VRTK简要说明

    1 导入VRTK开发包 下方三个为基础控件 用于识别硬件设备以及相关配置 2 移动功能简介 3 ui交互事件 将VRTK UICanvas 组件添加到Canvas下可用ui所有事件 1 问题容易出现ui穿透 所以在做的时候要防止穿透 最好不
  • sqli-labs通关大全(更新至Less60)

    sqli labs通关 less1 less10 箭雨镜屋 CSDN博客 sqli labs通关 less11 less20 箭雨镜屋 CSDN博客 sqli labs通关 less21 less30 箭雨镜屋 CSDN博客 sqli la
  • config:fail,Error: 系统错误,错误码:63002,invalid signature

    经过半天的尝试 终于把这个解决了 本文章比较是和 前端用 hash分享下这个问题吧 看了好多文章都没解决了我的问题 直接上干货 1 首先出一张基本的问题图 2 针对上面这个图第2点内 hash 做个讲解 因为我前端用的 hash模式 一般网
  • 编码之Base64编码

    Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法 目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一 为什么会有 Base64 编码呢 因为有些网络传送渠道并不支持所有的字节 例如 传统的
  • 【Xilinx AX7103 MicroBalze学习笔记2】MicroBlaze 串口发送 Hello World 实验

    目录 实验介绍 硬件设计 Vivado部分 创建工程 搭建Block Design MicroBlaze部分 外围模块部分 时钟模块 Uart部分 管脚绑定 时钟约束 生成Bit流文件 软件设计 SDK部分 板级验证 总结 往期系列博客 实
  • stm32无人机-飞行力学原理

    惯性导航 是一种无源导航 不需要向外部辐射或接收信号源 就能自主进行确定自己在什么地方的一种导航方法 惯性导航主要由惯性器件计算实现 惯性器件包括陀螺仪和加速度计 一般来说 惯性器件与导航物体固连 加速度计测量物体运动的加速度 已知初始状态
  • Java分治算法经典案例之汉诺塔

    分治算法 思想 当我们求解某些问题时 由于这些问题要处理的数据相当多 或求解过程相当复杂 使得直接求解法在时间上相当长 或者根本无法直接求出 对于这类问题 我们往往先把它分解成几个子问题 找到求出这几个子问题的解法后 再找到合适的方法 把它
  • Unable to install “xxx“

    Unable to install xxx Xcode Could not inspect the application package macOS Version 11 4 Build 20F71 Xcode 12 5 1 18212
  • Ubuntu终端使用todesk命令

    Ubuntu终端使用todesk命令 todesk是一款免费的远程控制软件 支持Windows Linux Mac Android iOS等多种平台 可以实现跨设备的远程控制 文件传输 远程打印等功能 本文将介绍如何在Ubuntu终端使用t
  • matlab求图像杰卡德系数,Jaccard similarity coefficient for image segmentation

    This example shows how to segment an image into multiple regions The example then computes the Jaccard similarity coeffi
  • 免费的云服务器,大家推荐哪个呢?

    搭建一个云平台的成本还是很高的 但是就没有企业免费为公众提供服务的吗 其实免费的服务器是有的 各大平台都有 阿里云 腾讯云都有 只是受时间限制的 大多数是7天或者15天 但是某丰云却号称是永久免费的 其实它是有前提的 释放以后的数据也就永远
  • 第一课:使用C++实现图片去水印

    目录 1 功能概述 2 具体实现 2 1 导入OpenCV库和头文件 2 2 读入图像并显示 2 3 提取水印区域 2 4 重构去除水印后的图像 3 完整代码如下 4 实现效果 5 介绍几种PS去水印的方法 5 1 裁剪法 5 2 借图法