OpenCV实现马赛克和毛玻璃滤镜效果
时间:2019-04-13
本文章向大家介绍OpenCV实现马赛克和毛玻璃滤镜效果,主要包括OpenCV实现马赛克和毛玻璃滤镜效果使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考,具体内容如下
一、马赛克效果
马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。
以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。
#include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; Mat imageSourceCopy; //原始图像 Mat imageSource; //原始图像拷贝 int neightbourHood = 9; //马赛克上每个方框的像素大小 RNG rng; int randomNum; //邻域内随机值 Point ptL; //左键按下时坐标 Point ptR; //右键按下时坐标 //鼠标回掉函数 void onMouse(int event, int x, int y, int flag, void *ustg); int main() { imageSourceCopy = imread("Test.jpg"); imageSource = imageSourceCopy.clone(); //imshow("马赛克", imageSourceCopy); namedWindow("马赛克"); setMouseCallback("马赛克", onMouse); waitKey(); } void onMouse(int event, int x, int y, int flag, void *ustg) { if (event == CV_EVENT_LBUTTONDOWN) { ptL = Point(x, y); } if (event == CV_EVENT_LBUTTONUP) { //对鼠标画出的矩形框超出图像范围做处理,否则会越界崩溃 x > imageSource.cols - 2 * neightbourHood ? x = imageSource.cols - 2 * neightbourHood : x = x; y > imageSource.rows - 2 * neightbourHood ? y = imageSource.rows - 2 * neightbourHood : y = y; //对鼠标从右下往右上画矩形框的情况做处理 ptR = Point(x, y); Point pt = ptR; ptR.x < ptL.x ? ptR = ptL, ptL = pt : ptR = ptR; for (int i = 0; i < ptR.y - ptL.y; i += neightbourHood) { for (int j = 0; j < ptR.x - ptL.x; j += neightbourHood) { randomNum = rng.uniform(-neightbourHood / 2, neightbourHood / 2); Rect rect = Rect(j + neightbourHood + ptL.x, i + neightbourHood + ptL.y, neightbourHood, neightbourHood); Mat roi = imageSourceCopy(rect); Scalar sca = Scalar( imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[0], imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[1], imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[2]); Mat roiCopy = Mat(rect.size(), CV_8UC3, sca); roiCopy.copyTo(roi); } } } imshow("马赛克", imageSourceCopy); waitKey(); }
可以通过改变程序中neightbourHood参数的大小调整小矩形快的大小,实现效果:
二、毛玻璃效果
毛玻璃效果的实现通过用像素点邻域内随机一个像素点的颜色替代当前像素点的颜色实现。
#include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; int main() { Mat imageSource = imread("Test.jpg"); Mat imageResult = imageSource.clone(); RNG rng; int randomNum; int Number = 5; for (int i = 0; i < imageSource.rows - Number; i++) for (int j = 0; j < imageSource.cols - Number; j++) { randomNum = rng.uniform(0, Number); imageResult.at<Vec3b>(i, j)[0] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[0]; imageResult.at<Vec3b>(i, j)[1] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[1]; imageResult.at<Vec3b>(i, j)[2] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[2]; } imshow("毛玻璃效果", imageResult); waitKey(); }
实现效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Linux自动每日备份
- Java进阶10 内存管理与垃圾回收
- Md5加密秘钥加密哈希加密
- JavaSE(十二)之IO流的字节流(一)
- 基于ASP.MVC票据FormsAuthenticationTicket身份认证
- AI需要大数据,而大数据也需要AI
- Java进阶09 事件响应
- JavaSE(十一)之异常处理详解
- 微信开发扫一扫功能并且屏蔽分享菜单
- HTML语义化:HTML5新标签——template
- 纸上谈兵: 左倾堆 (leftist heap)
- 统计Go, Go, Go
- 前端构建:Source Maps详解
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 通过Jenkins部署java项目
- Spring使用注解配置依赖注入
- Spring的依赖注入
- 通过Jenkins发布php代码
- 初识Spring
- 使用Python的BeautifulSoup库实现一个可以爬取1000条百度百科数据的爬虫
- 初识Spark
- 初识SpringBoot
- MyBatis结果集映射
- Hadoop分布式集群环境搭建
- 使用Hadoop统计日志数据
- Mybatis在接口上使用注解配置SQL语句以及接口与xml一起使用
- 分布式计算框架MapReduce
- 安装webpack后,执行webpack -v命令时报错:SyntaxError: Block-sc
- SpringMVC数据类型转换器与国际化配置