OpenCV实现马赛克和毛玻璃滤镜特效

本文实例为大家分享了OpenCV实现马赛克和毛玻璃滤镜特效的具体代码,供大家参考,具体内容如下

一、马赛克效果

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

以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。

代码:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

Mat inputImage;
Mat inputImage_mosaic;
Mat inputImage_clone;

//马赛克的大小
int neightbourhood = 20;

//记录鼠标的状态,0为鼠标左键未按下或弹起,1为鼠标左键按下
int mouseStatus = 0;

void onMouse(int events, int x, int y, int flag, void* ustg);

//创建马赛克图片
void createMosaicImage(Mat inputMat, Mat& outputMat, int size);

//设置马赛克区域
void setMosaic(Mat& inputMat, Rect rect);

int mainFun(void) {
 inputImage = imread("D:\\test\\12.jpg");
 inputImage_clone = inputImage.clone();
 createMosaicImage(inputImage, inputImage_mosaic, neightbourhood);

 namedWindow("showImage", WINDOW_AUTOSIZE);
 setMouseCallback("showImage", onMouse);

 waitKey();
 return 0;
}

void createMosaicImage(Mat inputMat, Mat& outputMat, int size) {
 RNG rng;
 int height = inputMat.rows;
 int width = inputMat.cols;
 Mat padding;
 Mat tempMat;

 //为了方便后面的计算,将输入的图像大小扩充到宽高都是size的倍数
 copyMakeBorder(inputMat, padding, 0, size - inputMat.rows % size, 0, size - inputMat.cols % size, BORDER_REPLICATE);
 tempMat = padding.clone();

 for (int row = 0; row < padding.rows; row += size) {
 for (int col = 0; col < padding.cols; col += size) {
  int rand_x = rng.uniform(0, size);
  int rand_y = rng.uniform(0, size);
  Rect rect = Rect(col, row, size, size);
  Mat roi = tempMat(rect);
  Scalar color = Scalar(padding.at<Vec3b>(row + rand_y, col + rand_x)[0], \
  padding.at<Vec3b>(row + rand_y, col + rand_x)[1], \
  padding.at<Vec3b>(row + rand_y, col + rand_x)[2]);
  roi.setTo(color);
 }
 }
 outputMat = tempMat(Rect(0, 0, width, height)).clone();
}

void setMosaic(Mat& inputMat, Rect rect) {
 Mat roi = inputMat(rect);
 Mat tempRoi = inputImage_mosaic(rect);
 tempRoi.copyTo(roi);
}

void onMouse(int events, int x, int y, int flag, void* ustg) {

 //当鼠标移除图片区域的时候,不做操作
 if (x < 0 || x > inputImage.cols || y < 0 || y > inputImage.rows) {
 return;
 }

 //马赛克块的位置信息
 int x_left, x_right, y_top, y_bottom;
 x - neightbourhood <= 0 ? x_left = 0 : x_left = x - neightbourhood;
 x + neightbourhood > inputImage.cols ? x_right = inputImage.cols : x_right = x + neightbourhood;
 y - neightbourhood <= 0 ? y_top = 0 : y_top = y - neightbourhood;
 y + neightbourhood > inputImage.rows ? y_bottom = inputImage.rows : y_bottom = y + neightbourhood;

 if (events == CV_EVENT_LBUTTONDOWN) {
 mouseStatus = 1;
 setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
 }
 else if (events == CV_EVENT_MOUSEMOVE) {
 if (mouseStatus == 1) {
  setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
 }
 else {
  //nothing
 }
 }
 else if (events == CV_EVENT_LBUTTONUP) {
 mouseStatus = 0;
 }
 else {
 //cout << "nothing" << endl;
 }
 imshow("showImage", inputImage_clone);
}

//-----开始------
void COpenCVLearningDlg::OnBnClickedStartButton()
{
 mainFun();
}

效果:

二、毛玻璃效果

毛玻璃效果的实现通过用像素点邻域内随机一个像素点的颜色替代当前像素点的颜色实现。

代码:

#include <core\core.hpp>
#include <highgui\highgui.hpp>

using namespace cv;

int mainFun()
{
 Mat imageSource = imread("D:\\test\\12.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();
 return 0;
}

//-----开始------
void COpenCVLearningDlg::OnBnClickedStartButton()
{
 mainFun();
}

结果:

参考链接:

OpenCV实现马赛克和毛玻璃滤镜效果

OpenCV实现马赛克功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV实现马赛克功能

    本文实例为大家分享了OpenCV实现马赛克功能的具体代码,供大家参考,具体内容如下 实现用按下鼠标左键拖动时,在鼠标经过的路径上打上马赛克. 马赛克的原理是将图像中选中区域的像素用这个选中区域中的某一像素覆盖. 为了不让鼠标重复经过图像中同一个的时候,选取不一样的像素,该程序将在输入图片的时候,就实现了全图的马赛克效果.而当鼠标划过的时候,程序只是将实现马赛克的图片的指定位置复制到显示的图像中. 效果类似于QQ截图中的马赛克. #include <opencv2\core\core.hpp>

  • OpenCV实现马赛克和毛玻璃滤镜效果

    本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考,具体内容如下 一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框. #include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; Mat i

  • OpenCV实现马赛克和毛玻璃滤镜特效

    本文实例为大家分享了OpenCV实现马赛克和毛玻璃滤镜特效的具体代码,供大家参考,具体内容如下 一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框. 代码: #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #

  • Opencv 马赛克和毛玻璃效果与图片融合的实现

    1.马赛克效果 马赛克的基本原理就是,用某一个区域的某一个像素点替代这个区域所有的像素点,从而导致图片出现模糊的效果,如下: import cv2 # 马赛克效果 img = cv2.imread(filename='../anqila21.jpg',flags=1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] flag = 2 # 系数,系数越小,马赛克的效果越不明显 for m in range(26,height):

  • Python实现PS滤镜特效之扇形变换效果示例

    本文实例讲述了Python实现PS滤镜特效之扇形变换效果.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 滤镜中的一种几何变换特效,称为扇形变换,将图像扭曲成一个扇形,具体的算法原理和效果图可以参考附录说明 import numpy as np from skimage import img_as_float import matplotlib.pyplot as plt from skimage import io import math import numpy.matl

  • python使用opencv实现马赛克效果示例

    本文实例讲述了python使用opencv实现马赛克效果.分享给大家供大家参考,具体如下: 最近要实现opencv视频打马赛克,在网上找了一下基本是C++的实现,好在原理一样,下面给出python实现. 原理和注意点,我都写在注释里了 import cv2 ##马赛克 def do_mosaic(frame, x, y, w, h, neighbor=9): """ 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内左上像素点的颜色代替,这样可以模糊细节,但是

  • Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例

    本文实例讲述了Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 滤镜特效,Marble Filter, 这种滤镜使图像产生不规则的扭曲,看起来像某种玻璃条纹, 具体的代码如下: import numpy as np import math import numpy.matlib from skimage import io import random from skimage import img_as_f

  • python 实现波浪滤镜特效

    本文用 Python 实现 PS 滤镜的波浪特效 import numpy as np from skimage import img_as_float import matplotlib.pyplot as plt from skimage import io import numpy.matlib import math # 图片位置 file_name2='D:/Visual Effects/PS Algorithm/4.jpg' img=io.imread(file_name2) img

  • OpenCV自动给图片添加彩虹特效的实现示例

    目录 背景介绍  实现步骤 [1]准备一张夏季风景图片,加载读取 [2]创建一张与原图同样大小的黑图,然后通过画椭圆函数绘制彩虹 [3]高斯模糊,让彩虹边缘更柔和过渡 [4]彩虹图像与风景图混合叠加(使用泊松融合效果更佳) 背景介绍 南方的冬季总是淅淅沥沥下着小雨,晴天渐渐成为奢望.此时,我多么希望感受一下夏季的温暖,哪怕是雨天,偶尔还会看到彩虹!想到这便动起手来,找找夏季的照片和视频,用OpenCV给它们加上漫天彩虹.  实现步骤 [1]准备一张夏季风景图片,加载读取 Mat src = im

  • Python+OpenCV实现六种常用图像特效

    目录 图像融合 灰度处理 颜色反转 灰度反转 彩色反转 马赛克效果 毛玻璃效果 浮雕效果 图像融合 按照一定的比例将两张图片融合在一起 addWeighted()方法: 参数1第一张图片矩阵 参数2第一张图片矩阵的权重 参数3第二张图片矩阵 参数4第二张图片矩阵的权重 融合之后的偏移量 进行叠加的两张图片宽高应该相同 叠加之后的像素偏移值如果填的话不要填太大,超过255会导致图像偏白 import cv2 import cv2 as cv img = cv.imread("img/lena.jp

随机推荐