快速均值模糊算法

前段时间在网上看到一个快速均值模糊算法,性能很不错。

源博客:

http://www.lellansin.com/super-fast-blur-%E6%A8%A1%E7%B3%8A%E7%AE%97%E6%B3%95.html

博主对其进行了简单的bug修正以及性能优化。

在博主机子上使用该算法对一张5000x3000的图片进行模糊处理,仅需500-600毫秒,速度非常快。

代码如下:

/*

* Super Fast Blur v1.1+

* Original author: Mario Klingemann (C++ version)
* Original address: http://incubator.quasimondo.com/processing/superfastblur.pde

* C version updated by Lellansin (http://www.lellansin.com)
* C version bugfix and performance optimization by tntmonks (http://tntmonks.cnblogs.com)
*/

void superFastBlur(unsigned char *pix, unsigned int w, unsigned int h, unsigned int comp, int radius)
{
	unsigned int div;
	unsigned int wm, hm, wh;
	unsigned int *vMIN, *vMAX;
	unsigned char *r, *g, *b, *dv;
	unsigned int rsum, gsum, bsum;
	unsigned int p, p1, p2, yi, yw;

	int x, y, i, yp;
	if (radius < 1)
		return;
	wm = w - 1;
	hm = h - 1;
	wh = w * h;
	div = radius + radius + 1;
	vMIN = (unsigned int *)malloc(sizeof(unsigned int) * max(w, h));
	vMAX = (unsigned int *)malloc(sizeof(unsigned int) * max(w, h));
	r = (unsigned char *)malloc(sizeof(unsigned char) * wh);
	g = (unsigned char *)malloc(sizeof(unsigned char) * wh);
	b = (unsigned char *)malloc(sizeof(unsigned char) * wh);
	dv = (unsigned char *)malloc(sizeof(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))) * comp;
			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]) * comp;
			p2 = (yw + vMAX[x]) * comp;
			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 (y = 0; y < h; y++)
		{ 
			pix[yi * comp] = (dv[bsum]);
			pix[yi * comp + 1] = (dv[gsum]);
			pix[yi * comp + 2] = (dv[rsum]);

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

			rsum += r[p1] - r[p2];
			gsum += g[p1] - g[p2];
			bsum += b[p1] - b[p2];
			yi += w;
		}
	} 

	free(r); 
	free(g); 
	free(b); 
	free(vMIN); 
	free(vMAX); 
	free(dv);
}

  该算法进行简单的修改可作图像增强之用。

该算法还可以进一步优化,这个任务就交给各位看官咯。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏帮你学MatLab

《Experiment with MATLAB》读书笔记(九)

读书笔记(九) %% 复数的极坐标形式 z = 3 + 4i r = abs(z) %极径 phi = angle(z) %幅角 ...

30590
来自专栏和蔼的张星的图像处理专栏

10.YOLO系列及如何训练自己的数据。

SSD失败之后就挺失望的,而且莫名其妙,于是转向YOLO了,其实object detection领域可选的模型并不多,RCNN系列我是大概看过的,还写过:RCN...

57520
来自专栏iOSDevLog

将Core ML模型集成到您的应用程序中

此示例应用程序使用经过训练的MarsHabitatPricer.mlmodel模型来预测火星上的栖息地价格。

8810
来自专栏CreateAMind

dcgan人脸生成效果复现-多图及代码学习

https://github.com/carpedm20/DCGAN-tensorflow

18810
来自专栏和蔼的张星的图像处理专栏

9.SSD目标检测之三:训练失败记录(我为什么有脸写这个……)

这个大概折腾了三四天,反正我能想到改的地方都改了,笔记本上试过了,宿舍的电脑上也试过了,反正就是不行,我也没什么办法了,后面就转向YoloV3了。尽管失败了,还...

24520
来自专栏Petrichor的专栏

tensorflow: 畅玩tensorboard图表(SCALARS)

这篇博客建立在你已经会使用tensorboard的基础上。如果你还不会记录数据并使用tensorboard,请移步我之前的另一篇博客:tensorflow: t...

38030
来自专栏AI研习社

Github 项目推荐 | GAN 非平稳纹理合成

该库是论文「Non-stationary texture synthesis using adversarial expansions.」的官方代码。

12530
来自专栏量化投资与机器学习

【机器学习】支持向量机的概念与运用初探

? ? ? ? ? 下面,使用python模块库sklearn自带的iris标准数据集进行简单测试。 ? 获得的分类图为: ? 此外,尝试在优矿平台上,...

21680
来自专栏AI研习社

GitHub项目推荐 | ChainerCV:计算机视觉中的深度学习图书馆

ChainerCV是一个使用Chainer训练和运行神经网络以进行计算机视觉任务的工具集合。

23450
来自专栏GAN&CV

使用tensorflow 的slim模块fine-tune resnet/densenet/inception网络,解决batchnorm问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

1.1K20

扫码关注云+社区

领取腾讯云代金券