入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

canvas像素级操作实现各种滤镜之高斯模糊

创建时间:2014-02-17 投稿人: 浏览次数:2647

相信用过PS的人很多都知道高斯模糊这个滤镜,详细的高斯模糊的原理可以猛击这个链接http://developer.51cto.com/art/201211/364930.htm。由于没有现成的canvas方面的算法实现,就得慢慢鼓捣那些基于java实现的代码。感觉这个http://blog.csdn.net/jia20003/article/details/7234741写的不错。


简单了解了原理后,发现要用到二维高斯函数,还得卷积什么的,更坑的是js里的二维数组(建立都麻烦)实在是不给力,建立高斯操作数倒是不成问题,但是最后在卷积时时不知道是怎么了调了很长时间没调出来,而且叠了四个for循环实在是让人不放心。后来觉得可以试一下分为x轴和y轴遍历才实现了功能,google之后发现有一个家伙跟我的思路差不多,但人家写的那叫一个明了关键代码如下。

	//高斯模糊  参数说明:width:canvas对象或者是数据体对象的宽,height:canvas或者是数据体对象的高,
	//radius:模糊取值半径(默认为3),sigma:方差取值(默认为1)
	/**
	 * [Gaussian_blur description]
	 * @param {[type]} data   [description]
	 * @param {[type]} width  [description]
	 * @param {[type]} height [description]
	 * @param {[type]} radius [description]
	 * @param {[type]} sigma  [description]
	 */
	function Gaussian_blur(data, width, height, radius, sigma) {
		var gaussMatrix = [],
			gaussSum = 0,
			x, y,
			r, g, b, a,
			i, j, k, len;

		radius = Math.floor(radius) || 3;
		sigma = sigma || radius / 3;

		a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
		b = -1 / (2 * sigma * sigma);
		//生成高斯矩阵
		for (i = 0, x = -radius; x <= radius; x++, i++) {
			g = a * Math.exp(b * x * x);
			gaussMatrix[i] = g;
			gaussSum += g;

		}

		//归一化, 保证高斯矩阵的值在[0,1]之间
		for (i = 0, len = gaussMatrix.length; i < len; i++) {
			gaussMatrix[i] /= gaussSum;
		}

		//x方向
		for (y = 0; y < height; y++) {
			for (x = 0; x < width; x++) {
				r = g = b = a = 0;
				gaussSum = 0;
				for (j = -radius; j <= radius; j++) {
					k = x + j;	a=j+row;
					if (k >= 0 && k < width) { //确保 k 没超出 x 的范围

						i = (y * width + k) * 4;
						r += data[i] * gaussMatrix[j + radius];
						g += data[i + 1] * gaussMatrix[j + radius];
						b += data[i + 2] * gaussMatrix[j + radius];
						gaussSum += gaussMatrix[j + radius];
					}
				}
				i = (y * width + x) * 4;

				data[i] = r / gaussSum;
				data[i + 1] = g / gaussSum;
				data[i + 2] = b / gaussSum;
			}
		}
		//y方向
		for (x = 0; x < width; x++) {
			for (y = 0; y < height; y++) {
				r = g = b = a = 0;
				gaussSum = 0;
				for (j = -radius; j <= radius; j++) {
					k = y + j;
					if (k >= 0 && k < height) { //确保 k 没超出 y 的范围
						i = (k * width + x) * 4;
						r += data[i] * gaussMatrix[j + radius];
						g += data[i + 1] * gaussMatrix[j + radius];
						b += data[i + 2] * gaussMatrix[j + radius];
						gaussSum += gaussMatrix[j + radius];
					}
				}
				i = (y * width + x) * 4;
				data[i] = r / gaussSum;
				data[i + 1] = g / gaussSum;
				data[i + 2] = b / gaussSum;

			}
		}

		return data;
	}


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像