一、马赛克效果

马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。

以下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();
}

实现效果:

OpenCV实现马赛克和毛玻璃滤镜效果的更多相关文章

  1. OpenCV——PS滤镜,毛玻璃特效

    程序完成 "毛玻璃" 特效, 不过边缘没有处理,使得最终的图像有黑边. 不过,有了黑边,感觉效果也不错,所以这个bug 没有管. #ifndef PS_ALGORITHM_H_IN ...

  2. OpenCV 图像处理的各种滤镜效果实现

    引自:https://blog.csdn.net/column/details/stylizefliter.html 学习OpenCV:滤镜系列(15)——羽化(模糊边缘) 在PHOTOSHOP里,羽 ...

  3. opencv马赛克python实现

    最近要实现opencv视频打马赛克,在网上找了一下基本是C++的实现,好在原理一样,下面给出python实现. 原理和注意点,我都写在注释里了 import cv2 ##马赛克 def do_mosa ...

  4. OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...

  5. OpenCV——马赛克

    具体的算法可以参考: PS 滤镜 马赛克 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_ ...

  6. css 给图片添加滤镜效果,透明层毛玻璃效果

    我们用的第一个滤镜是sepia(),他会给图片增加一整降饱和度的橙色染色效果 原图 添加sepia滤镜的效果 img{ width:100%; transition: .5s filter; filt ...

  7. OpenCV——高斯模糊与毛玻璃特效

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  8. IOS--实现滤镜效果的四种方式

    IOS–实现滤镜效果 demo地址: https://github.com/AbeDay/ios–.git 使用CIFilter来完成IOS中滤镜效果 在IOS中可以使用系统自带的方法来达到路径效果: ...

  9. 使用CSS3制作导航条和毛玻璃效果

    导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生一些.简单的说,毛玻璃其实就是让图片或者背景使用相应的方法进行模糊处理.这种效果对用户来说是十分具有视觉冲击力的. 本次分享的主题 ...

随机推荐

  1. ZOJ 1136 Longest Ordered Subsequence DP

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1136 题目大意:给定一串序列,求最长的升序列长度,如1, 7, 3, ...

  2. 12.1、USB驱动——描述符、URB、管道

    大家常说,一个设备通常有多个配置,配置通常有多个接口,接口通常有多个端点.接口代表逻辑上的设备,比如声卡分为 录音和播放.访问设备时,访问的是某个接口(逻辑设备).除了端点0之外,每个端点只支持一个传 ...

  3. LUA凝视语法

    server端代码已经完毕,client正在优化.游戏不久将上线,近期没事做,老大要我開始学习project Anarchy了.里面代码是比較偏爱的C++,包括lua,暂没学过lua.看了下LUA代码 ...

  4. 机器学习01-kNN邻近算法

    k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...

  5. [CSS] No selectable effect

    .noselect { -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Chrome/Safar ...

  6. itunes app 下载链接的几种表现形式

    第一种:itunes://itunes.apple.com/cn/app/id794862904 ,这是最普通的一种. 直接在浏览器中输入.就能够打开电脑上安装的itunes,并跳转到相应的app下载 ...

  7. C# 软件编码规范

    一.代码注释 并不是所有的代码均需要注释. 1.类头部注释 /// <summary> /// 描述类的用途 /// 作者: 张三 /// 日期: 2015/12/1 /// </s ...

  8. [Angular] Enable router tracing

    To enable router tracing is really simple: RouterModule.forRoot(ROUTES, { enableTracing: true }) Whe ...

  9. Android 虚拟机学习总结Dalvik虚拟机介绍

    1.Dalvik虚拟机与Java虚拟机的最显著差别是它们分别具有不同的类文件格式以及指令集.Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是 ...

  10. MouseGestureL.ini shift up/down/left/right edge

    MouseGestureL.ini [ShiftPress]Icon=C:\Windows\System32\explorer.exe,6Custom=GetKeyState("Shift& ...