快速高斯模糊算法

由于项目需要,做一个高斯模糊的效果,实现毛玻璃的效果用于软件的界面上,当然算法的速度不能慢。GDI+1.1提供了这种特效,而且速度超快,处理1680*640的图像200ms左右,而且只有模糊半径R为[10,20]的时候,会出现峰值200ms左右,其余R都在200ms以下,甚至达到几十ms的速度。但是xp上的版本为GDI+1.0,不能直接使用GDI+ 的特效,不得已只能寻找开源实现。之后搜到了这个帖子:http://bbs.csdn.net/topics/380203851。一楼提供了这个网站:http://incubator.quasimondo.com/processing/superfast_blur.php上面的代码是processing2的代码,右下角有cpp的实现,这正不是想要的么。阅读源码发现(http://oppei.tumblr.com/post/47346262/super-fast-blur-v1-1-by-mario-klingemann),需要RGBRGB这样的内存结构的图像,这是24位的微软上Bitmap的内存结构,不过DIB的格式又有点不同,它是BGRBGR..这种顺序,而且在每行的末尾,如果该行像素点所占用的内存不是4B的整数倍,会用0补齐。于是,我将代码修改成如下:

void superFastBlur(unsigned char * pix, int w, int h, int radius) {
	if (radius<1) return;

	int wm=w-1;
	int hm=h-1;
	int wh=w*h;
	int div=radius+radius+1;
	unsigned char * r=new unsigned char[wh];
	unsigned char * g=new unsigned char[wh];
	unsigned char * b=new unsigned char[wh];
	int rsum,gsum,bsum,x,y,i,p,p1,p2,yp,yi,yw;
	int *vMIN = new int[max(w,h)];
	int *vMAX = new int[max(w,h)];

	unsigned char *dv=new unsigned char[256*div];

	for (i=0;i<256*div;i++) 
		dv[i]=(i/div);

	yw=yi=0;

	for (y=0;y<h;y++){
		rsum=gsum=bsum=0;
		for(i=-radius;i<=radius;i++){
			p = (yi + min(wm,max(i,0))) * 3;
			bsum += pix[p];
			gsum += pix[p+1];
			rsum += pix[p+2];
		}
		for (x=0;x<w;x++){

			r[yi]=dv[rsum];
			g[yi]=dv[gsum];
			b[yi]=dv[bsum];

			if(y==0){
				vMIN[x]=min(x+radius+1,wm);
				vMAX[x]=max(x-radius,0);
			}
			p1 = (yw+vMIN[x])*3;
			p2 = (yw+vMAX[x])*3;

			bsum += pix[p1] - pix[p2];
			gsum += pix[p1+1] - pix[p2+1];
			rsum += pix[p1+2] - pix[p2+2];

			yi++;
		}
		yw+=w;
	}

	for (x=0;x<w;x++){
		rsum=gsum=bsum=0;
		yp=-radius*w;
		for(i=-radius;i<=radius;i++){
			yi=max(0,yp)+x;
			rsum+=r[yi];
			gsum+=g[yi];
			bsum+=b[yi];
			yp+=w;
		}
		yi=x;
		for
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值