PhotoShop算法实现进阶-模糊滤镜-运动模糊(二十四)

[email protected]

http://blog.csdn.net/kezunhai

造成图像退化或者说使图像模糊的原因有很多种,如果是因为在摄像时相机和被摄景物之间有相对运动而造成的图像模糊则称为运动模糊。所得到图像中的景物往往会模糊不清,我们称之为运动模糊图像。运动模糊(Motion Blur)是一种抓取物体运动状态效果的滤镜,主要应用物体运动时曝光的摄影手法,模拟出在摄像中拍摄运动物体的间接曝光功能,从而使图像产生出一种动态效果。它通常用来制造物体掠过或移动的效果。

实现原理:运动模糊滤镜沿特定的方向,并以特定的强度进行模糊处理。首先,在数学上,Y轴向上为正,而在图像处理中,Y轴向下为正,所以在获取用户指定方向角度后,应先将其沿正方形旋转180°;接着,解决图像在指定方向上的位移问题。运动莫不是简单地将图像在指定的图像上移来移去,而是在距离限定的范围内,按某种方式复制并叠加像素。简单地可以看成,将一幅图像的多张副本叠放在指定的方向上,然后取其平均值;最后,要解决的问题就是图像的透明度,处理Alpha分类,这样最终产生的模糊效果才更理想。

实现算法:

// 添加运动模糊效果
// angle:运动的方向, distance:运动的距离
// 这里只是粗略的计算,以dx的长度为准,也可以以dy或dx+dy等长度为准
// 如果需要更精确的计算,请参考有关专业文献
void PhotoShop::MotionBlur(Mat& img, Mat& dst, int angle/* =30 */, int distance/* =100 */)
{
	angle = angle%360;
	if ( distance <1 ) distance = 1;
	if ( distance > 200) distance = 200;

	double radian = ((double)angle+180.0)/180.0*PI; // 角度转弧度
	int dx = (int)((double)distance* cos(radian)+0.5);
	int dy = (int)((double)distance* sin(radian)+0.5);

	int sign;
	if ( dx<0) sign = -1;
	if ( dx>0) sign = 1;

	int height = img.rows;
	int width = img.cols;
	int chns = img.channels();

	if (dst.empty())
		dst.create(height, width, img.type());

	int i,j ,k, i0, j0, p, sum, count;
	for ( i=0; i<height; i++)
	{
		unsigned char* dstData = (unsigned char*)dst.data + dst.step*i;
		for ( j=0; j<width; j++)
		{
			for ( k=0; k<chns; k++)
			{
				sum = 0, count =0;
				for ( p=0; p<abs(dx); p++)
				{
					i0 = i + p*sign;
					j0 = j + p*sign;
					if ( i0>=0 && i0<height && j0>=0 && j0<width)
					{
						count++;
						sum += getPixel(img, i0, j0, k);
					}
				}
				if ( count == 0)
				{
					dstData[j*chns+k] = getPixel(img, i, j, k);
				}
				else
				{
					dstData[j*chns+k] = saturate_cast<uchar>(sum/(double)count+0.5);
				}

			}// for k
		} // for j
	}
}

测试效果(angle=60, distance = 50):

再来张女神的最爱:

下面这篇文章详细介绍了运动模糊,有兴趣的读者可以参考:

1、什么是运动模糊(Motion Blur)

2、 高质量单幅图片运动去模糊

作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。

时间: 2024-10-06 02:47:17

PhotoShop算法实现进阶-模糊滤镜-运动模糊(二十四)的相关文章

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三) [email protected] http://blog.csdn.net/kezunhai 高斯模糊(Gaus Blur)采用二维高斯模板对图像进行模糊处理,用于图像模糊化(去除细节和噪声),它的处理效果给人一种更佳柔和的感觉. 一维高斯: 二维高斯: 理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核.实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可. 如下图为一个标准差为1.0的整数值高斯核:

Houdini中给火花渲染准确的运动模糊 - 给运动模糊做非线性差值的方法以及固定粒子点数的方法

估计大家都知道使用运动速度来进行运动模糊的渲染,但是往往这个方法得到的运动模糊都是线性变化的,虽然乍一看没什么问题,但是如果想要每一帧的模糊轨迹也是有曲线变化的而不是僵硬的直来直去的话,使用trail算个速度来做的运动模糊是永远做不到这一点的. 这里我想通过常用的火花(spark)的运动模糊来讲一讲我所了解的一些比较好的方法. 所谓渲染中的运动模糊无非就是差值算法.目前使用的比较多的主要有两种.第一种就是上面说到的直接使用速度来线性差值,这种方法会计算每一个点的速度方向,计算出前一帧或者后一帧的

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树 >=左子树的所有key,<=右子树的所有key 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成. h>=(lgn向下取整) 和快速排序算法一样,其平均性能更接近于最好情形. 随机构建二叉搜索树期望高度为O(lgn). 各种操作请自行查阅. 第十三章 红黑树 是一种(近似)平衡的二叉搜索树.可以保证在最坏情况下基本动态集合操作的时

PS 滤镜——运动模糊

%%%%%  motion blur clc; clear all; close all; Image=imread('4.jpg'); Image=double(Image); theta=pi/4; len=20; row=floor(len*sin(theta))+1; col=floor(len*cos(theta))+1; motion_f1(1:row,1:col)=0; K=tan(theta); center_x=col/2; center_y=row/2; for i=1:ro

算法系列之二十四:离散傅立叶变换之音频播放与均衡器

导语 在算法系列的第二十二篇,我们介绍了离散傅立叶变换算法的实现,将时域的音频信号转换到频域进行分析,获取拨号音频的频率特征.这一篇我们将介绍一种频域均衡器的实现方法,所谓的频域均衡器,就是在频域信号的基础上对音频数据进行调整,然后再将频域信号转换成时域信号在回放设备上播放,从而达到音色调节的目的.将频域信号转换成时域信号的算法,就是离散傅立叶逆变换算法. 1 离散傅立叶逆变换 有从时域转换到频域的方法,就必然有从频域转换到时域的方法,相对于离散傅里叶变换,这个反向转换就是离散傅里叶逆变换(ID

浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)

主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子空间追踪(SP)几乎完全一样,因此算法流程也基本一致. SP与CoSaMP主要区别在于"Ineach iteration, in the SP algorithm, only K new candidates are added, while theCoSAMP algorithm adds 2K

《Nodejs开发加密货币》之二十四:DPOS机制(分布式共识算法)

前言 共识机制是分布式应用软件特有的算法机制.在中心化的软件里,再复杂的问题都可以避开使用复杂的算法逻辑(当然,如果能用算法统领,代码会更加简洁.高效),在开发设计上可以省却一定的麻烦.但在分布式软件开发中,节点间的互操作,节点行为的统一管理,没有算法理论作为支撑,根本无法实现.所以,要想开发基于分布式网络的加密货币,共识机制无法回避. 在第一个部分,专门用一篇文章<共识机制,可编程的"利益"转移规则>来介绍共识机制的作用,也对比了当前加密货币领域常用的三种共识算法原理和优

SSE图像算法优化系列二十四: 基于形态学的图像后期抗锯齿算法--MLAA优化研究。

偶尔看到这样的一个算法,觉得还是蛮有意思的,花了将近10天多的时间研究了下相关代码. 以下为百度的结果:MLAA全称Morphological Antialiasing,意为形态抗锯齿是AMD推出的完全基于CPU处理的抗锯齿解决方案.对于游戏厂商使用的MSAA抗锯齿技术不同,Intel最新推出的MLAA将跨越边缘像素的前景和背景色进行混合,用第2种颜色来填充该像素,从而更有效地改进图像边缘的变现效果,这就是MLAA技术. 其实就是这个是由Intel的工程师先于2009年提出的技术,但是由AMD将