高斯模糊算法

一维正态分布函数:


对应的曲线如下:


其实就是将某一像素点一定半径内的rgb值按照以上权重分布求出此点的rgb值。

图片像素是二维矩阵,修改如下:


对一个二维的像素矩阵可以分别在水平与垂直方向进行一维高斯模糊其效果等同与二维高斯模糊效果,速度更快。

测试图片如下:


代码如下:

void CGSmooth::generateGaussianKeneral( int radius,float sigma )
{
	float sigma22 = 2*sigma*sigma;
	float pi2 = 2.0*PI;
	float sqrtSigmaPi2 = sqrt(pi2) * sigma;
	int size = 2*radius + 1;
	int index = 0;
	m_gaussianKeneral = new float[size];
	float sum = 0.0f;
	for(int i = -radius; i <= radius; ++i)
	{
		float distance = i*i;
		m_gaussianKeneral[index] = exp((-distance)/sigma22) / sqrtSigmaPi2;
		sum += m_gaussianKeneral[index];
		++index;
	}

	for(i = 0; i < size; ++i)
	{
		m_gaussianKeneral[i] /= sum;
	}
}

int CGSmooth::clamp( float v )
{
	return (int)(v < 0 ? 0 : ( v > 255 ? 255 : v));
}

void CGSmooth::blur( int inPixels[], int outPixels[], int width, int height )
{
	int subCol = 0;  
	int index = 0, index2 = 0;  
	float redSum=0, greenSum=0, blueSum=0;  

	for(int row=0; row < height; row++)
	{
		int ta = 0, tr = 0, tg = 0, tb = 0;  
		index = row;  

		for(int col = 0; col < width; col++)
		{
			redSum = 0.0f;
			greenSum = 0.0f;
			blueSum = 0.0f;
			for(int m = -m_radius; m <= m_radius; m++)
			{
				subCol = col + m;
				if(subCol < 0 || subCol >= width)
				{
					subCol = 0;
				}

				index2 = row * width + subCol;
				ta = (inPixels[index2] >> 24) & 0xff;  
				tr = (inPixels[index2] >> 16) & 0xff;  
				tg = (inPixels[index2] >> 8) & 0xff;  
				tb = inPixels[index2] & 0xff; 

				redSum += (tr * m_gaussianKeneral[m + m_radius]);  
				greenSum += (tg * m_gaussianKeneral[m + m_radius]);  
				blueSum += (tb * m_gaussianKeneral[m + m_radius]); 
			}
			outPixels[index] = (ta << 24) | (clamp(redSum) << 16) | (clamp(greenSum) << 8) | clamp(blueSum); 
			index += height; 
		}
	}
}
代码参考http://blog.csdn.net/jia20003/article/details/9156935



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值