OpenCV-PS扩散毛玻璃效果的实现代码

实现原理

PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像中任一点的数值赋值为,以该点为中心一定尺寸窗口(如3*3,5*5)内随机一个点的数值。

功能函数代码

// 扩散效果
cv::Mat Diffusion(cv::Mat src,int size)
{
	int row = src.rows;
	int col = src.cols;
	RNG rng;
	cv::Mat result = src.clone();
	for (int i = size; i < row- size; ++i)
	{
		uchar* t = result.ptr<uchar>(i);
		for (int j = size; j < col- size; ++j)
		{
			int tmp = rng.uniform(0, 2*size+1);
			t[3 * j] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)));
			t[3 * j + 1] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)) + 1);
			t[3 * j + 2] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)) + 2);
		}
	}
	return result;
}

C++测试代码

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

cv::Mat Diffusion(cv::Mat src, int size);

int main()
{
	cv::Mat src = imread("test.jpg");
	int size = 5;
	cv::Mat result = Diffusion(src,size);
	cv::imshow("original", src);
	cv::imshow("result", result);
	waitKey(0);
	return 0;
}

// 扩散效果
cv::Mat Diffusion(cv::Mat src,int size)
{
	int row = src.rows;
	int col = src.cols;
	RNG rng;
	cv::Mat result = src.clone();
	for (int i = size; i < row- size; ++i)
	{
		uchar* t = result.ptr<uchar>(i);
		for (int j = size; j < col- size; ++j)
		{
			int tmp = rng.uniform(0, 2*size+1);
			t[3 * j] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)));
			t[3 * j + 1] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)) + 1);
			t[3 * j + 2] = src.at<uchar>(i - size + tmp / (2 * size + 1), 3 * (j - size + tmp % (2 * size + 1)) + 2);
		}
	}
	return result;
}

测试效果

图1 原图

图2 5*5扩散

图3 11*11扩散

适当地调整size,可以改变扩散的强度,进而带来不一样的质感。

如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

到此这篇关于OpenCV-PS扩散毛玻璃效果的文章就介绍到这了,更多相关OpenCV毛玻璃内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Eclipse下基于Java的OpenCV开发环境配置教程

    最近研究OpenCV想用java进行开发,因此研究了一下怎么在Eclipse中配置基于java的Opencv. 第一步:先到OpenCV官网下载你想要的版本,假设使用的是2.4.6版本.在官网下载你想要的版本,解压到本地的某个目录.比如 D:/OpenCV/. 第二步,打开Eclipse,并找到Window –> Preferences. 第三步:进入Preferences菜单后,找到Java –> Build Path –> User Libraries ,然后点击New 第四步:点击

  • 使用python-opencv读取视频,计算视频总帧数及FPS的实现

    如下所示: 1.计算总帧数 import os import cv2 video_cap = cv2.VideoCapture('ffmpeg_test.avi') frame_count = 0 all_frames = [] while(True): ret, frame = video_cap.read() if ret is False: break all_frames.append(frame) frame_count = frame_count + 1 # The value be

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

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

  • 详解opencv中画圆circle函数和椭圆ellipse函数

    1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1,   int lineType = LINE_8, int shift = 0); ellipse函数将椭圆画到图像 lmg 上, 椭圆中心为点center,并且大小位于矩形 axes

  • OpenCV-PS扩散毛玻璃效果的实现代码

    实现原理 PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉.其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像中任一点的数值赋值为,以该点为中心一定尺寸窗口(如3*3,5*5)内随机一个点的数值. 功能函数代码 // 扩散效果 cv::Mat Diffusion(cv::Mat src,int size) { int row = src.rows; int col = src.cols; RNG rng; cv::Mat result = src.clone();

  • 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):

  • Qt实现简易毛玻璃效果的示例代码

    目录 现有功能 运行结果 源码 frosted_glass_label.h frosted_glass_label.cpp main.cpp 现有功能 1.用模糊功能实现简易的毛玻璃效果. 2.鼠标移动无边框窗口. 运行结果 源码 frosted_glass_label.h #ifndef FROSTEDGLASSLABEL_H #define FROSTEDGLASSLABEL_H #include <QWidget> #include <QLabel> #include <

  • Android开发之毛玻璃效果实例代码

    这是在网上找的,不过忘了在哪里找的,经过很多比较测试,发现这个方法不会 oom,目前来看 我一直没有遇过,今天才找到这个以前建立的工程,记录下来: 先给大家展示下效果图: public class FastBlur { public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { // This is a compromise between Gaussian Blur and Box

  • Android学习教程之图片毛玻璃效果(4)

    本教程为大家分享了Android毛玻璃效果的具体代码,供大家参考,具体内容如下 BlurimageActivity.java代码: package com.siso.crazyworld; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivit

  • opencv实现图像缩放效果

    本文实例为大家分享了opencv实现图像缩放效果的具体代码,供大家参考,具体内容如下 图像缩放: 图像缩放即对图像的大小进行调整,即放大或者缩小 cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR) 参数: 实现代码: import cv2 as cv import matplotlib.pyplot as plt # 中文显示配置 plt.rcParams['font.sans-serif']=['SimHei'] # 用

  • opencv实现图像平移效果

    本文实例为大家分享了opencv实现图像平移效果的具体代码,供大家参考,具体内容如下 图像平移: 按照指定方向和距离,移动到相应位置 格式:cv.warpAffine(img,M,dsize) 参数: 实现代码: import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 中文显示配置 plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 plt.rcPara

  • Android实现水波纹扩散效果的实例代码

    本文讲述了Android实现水波纹扩散效果的实例代码.分享给大家供大家参考,具体如下: 项目地址下载 1.效果图: 2.使用方法: 在xml里使用RippleImageView自定义控件: xmlns:app="http://schemas.android.com/apk/res-auto" <com.army.rippleimage.RippleImageView android:id="@+id/rippleImageView" android:layou

  • OpenCV绘制圆端矩形的示例代码

    目录 功能函数 测试代码 测试效果 本文主要介绍了OpenCV绘制圆端矩形的示例代码,分享给大家,具体如下: 功能函数 // 绘制圆端矩形(药丸状,pill) void DrawPill(cv::Mat mask, const cv::RotatedRect &rotatedrect, const cv::Scalar &color, int thickness, int lineType) { cv::Mat canvas = cv::Mat::zeros(mask.size(), CV

  • iOS毛玻璃效果的实现及图片模糊效果的三种方法

    App设计时往往会用到一些模糊效果或者毛玻璃效果,iOS目前已提供一些模糊API可以让我们方便是使用. 话说苹果在iOS7.0之后,很多系统界面都使用了毛玻璃效果,增加了界面的美观性,比如下图的通知中心界面; 但是其iOS7.0的SDK并没有提供给开发者实现毛玻璃效果的API,所以很多人都是通过一些别人封装的框架来实现,后面我也会讲到一个; 其实在iOS7.0(包括)之前还是有系统的类可以实现毛玻璃效果的, 就是 UIToolbar这个类,并且使用相当简单,几行代码就可以搞定. 下面是代码实现:

随机推荐