图像去水印——opencv实现

功能简介:通过拖动鼠标实现指定区域水印或是斑点的去除。
实现原理:利用opencv鼠标操作setMouseCallback函数框选(左上到右下)需要处理的区域,按下鼠标开始选中,松开鼠标结束,对选中区域进行像素替换(根据不同图像,可选不同方式),再对选中区域周围高斯滤波,平滑处理,再对整体图像双边滤波(人像可美颜,增强立体感),对图像做进一步平滑处理。

代码如下:

#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
using namespace cv;
//读入图像
Mat org = imread("E:/壁纸/tx.jpg");
Mat  img, tmp;
Mat src = org;
Mat  dst = Mat(src.size(), src.type(), CV_8UC3);
static Point pre_pt;//初始坐标 (选中区域左上角)
static Point cur_pt;//实时坐标 (选中区域右下角) void on_mouse(int event, int x, int y, int flags, void *ustc);
int main()
{org.copyTo(img);org.copyTo(tmp);namedWindow("img", CV_WINDOW_AUTOSIZE);//定义一个img窗口  setMouseCallback("img", on_mouse);//调用回调函数  waitKey(0);return 0;
}
void on_mouse(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号
{char temp[16];//定义坐标显示字符数组if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标{//获取选中区域矩形左上角坐标pre_pt = Point(x, y);imshow("img", img);}else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))//左键没有按下的情况下,鼠标移动  {img.copyTo(tmp);//将img复制到临时图像tmp上,用于显示实时坐标  sprintf_s(temp, "(%d,%d)", x, y);//坐标cur_pt = Point(x, y);//获取实时坐标putText(tmp, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));//实时显示鼠标移动的坐标  imshow("img", tmp);}else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))//左键按下时,鼠标移动,则在图像上划矩形  {imshow("img", img);}else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形  {//获取实时坐标(选中区域矩形右下角)cur_pt = Point(x, y);//对选中区域进行像素替换,偏移3个像素,根据实际情况调节for (int i = min(pre_pt.y, cur_pt.y); i < max(cur_pt.y, pre_pt.y); i++){for (int j = min(pre_pt.x, cur_pt.x); j < max(cur_pt.x, pre_pt.x); j++){src.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j -3)[0];src.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j -3)[1];src.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j-3)[2];}}//对选中区域周围进行平滑处理Mat imageroi = src(Range(pre_pt.y - 3, cur_pt.y + 3), Range(pre_pt.x - 3, cur_pt.x + 3));GaussianBlur(imageroi, imageroi, Size(15, 15), 0, 0);//对整体图像双边滤波(对人像有美颜效果)bilateralFilter(src, dst, 15, 30, 9);//保存处理后的图像(如有必要)imwrite("E:/壁纸/txa.jpg", dst);//标记选中区域circle(img, pre_pt, 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);rectangle(img, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);//显示结果namedWindow("结果", CV_WINDOW_AUTOSIZE);imshow("结果", dst);}}

结果显示

效果还不错!
也可考虑在鼠标操作函数之前对图像平滑处理,效果因图像而异。

图像去水印——opencv实现相关推荐

  1. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  2. 图像金字塔与图像融合——OpenCv库

    图像金字塔与图像融合--OpenCv 内容来自博客~ OpenCV中图像特征描述算法(SIFT,SURF,ORB等)中涉及了图像金字塔的内容. 高斯金字塔 高斯金字塔是最基本的图像塔.首先将原图像作为 ...

  3. ROS图像与OpenCV图像相互转换

    参考: https://blog.csdn.net/u013794793/article/details/79925491 使用cv_bridge将ROS图像转换为OpenCV图像,以及OpenCV图 ...

  4. OpenCVSharp(C# OpenCV)图像去水印实例(二) 去除水印并保留文本原始色彩

    导读 具体介绍与实现步骤请参考下面文章: 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)_Color Space的博客-CSDN博客点击下方卡片,关注"OpenCV与AI深度学习 ...

  5. OpenCVSharp(C# OpenCV)图像去水印实例

    导读 具体介绍与实现步骤请参考下面文章: OpenCV对比度亮度变换竟能用来去水印(附Python/C++源码)_Color Space的博客-CSDN博客点击下方卡片,关注"OpenCV与 ...

  6. 利用FreeImage将gif图像转为opencv中的Mat

    原文:http://www.cnblogs.com/monkeyhey/p/3927857.html 网上有将gif转为iplimg的版本,只是用惯了C++的接口,所以就写了个转Mat的版本,代码比较 ...

  7. python opencv二值化图像_python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘...

    python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘 python opencv 1,读取图像 2,图像变矩阵 3,图像转灰度图像 4,彩色图像是3D数组 5,灰度图像是2 ...

  8. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  9. Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)

    前言 本文来结合下opencv的highgui功能显示kinect采集得来的颜色图和深度图.本来在opencv中自带了VideoCapture类的,使用该类可以直接驱动kinect设备,具体的可以参考 ...

最新文章

  1. 多种特征提取算法比较汇总
  2. 自然语言处理笔记2-哈工大 关毅
  3. php怎么运行网页_PHP的作用是什么?
  4. [洛谷P1439]排列LCS问题
  5. c语言around用法,KET基础语法:介词among和around的用法及例句
  6. Hashtable、HashMap、TreeMap总结
  7. 从FLC中学习的设计模式系列-创建型模式(3)-工厂方法
  8. 服务器虚拟化十大因素
  9. 0708 - 今天休息,顺便废了个点子
  10. ps软件打不开计算机受限制,win10系统打不开ps软件的处理技巧
  11. 损失 18 万,获刑 7 年,又又又是程序员删库!
  12. js获取本周日期和上周日期 --- 随手记录备忘
  13. java -- 解决InputStream不可重复读的问题
  14. python数据分析入门学习笔记
  15. 《文本大数据情感分析》读书报告
  16. 云原生 + 无代码,「DaoCloud 道客」探索无限可能——「DaoCloud 道客」+轻流联合解决方案
  17. Java实现监督学习在Aliens游戏中的探究尝试
  18. (附源码)计算机毕业设计SSM基于web的企业人事管理系统
  19. 客户订购登记管理系统(数据库)
  20. Nao动作控制总结(一)

热门文章

  1. 我的世界服务器物品复制,我的世界服务器复制物品bug2018 | 手游网游页游攻略大全...
  2. 最大扇入数怎么判断_被臭虫咬了怎么办,怎么消灭臭虫?
  3. vue中静态资源文件中的图片element.style.backgroundImage设置url无效问题
  4. ubuntu 命令行 2080TI 安装显卡驱动
  5. Presion,Recall 通俗解释
  6. 成为一名优秀的程序员,写出优雅的代码,要看哪本书?
  7. Node.js:pm2管理进程启动npm run dev和开机自启
  8. 漫谈能上QQ不能上网问题【转】
  9. Allure的安装与使用
  10. linux中的ldd命令简介