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(); }
实现效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
栏 目:C语言
下一篇:C语言贪吃蛇经典小游戏
本文标题:OpenCV实现马赛克和毛玻璃滤镜效果
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/923.html
您可能感兴趣的文章
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10用C++实现DBSCAN聚类算法
- 01-10深入全排列算法及其实现方法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10用C语言实现单链表的各种操作(一)
- 01-10用C语言实现单链表的各种操作(二)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文