好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

对Photoshop高斯模糊滤镜的算法总结

最近有感于部分网友对高斯模糊滤镜的研究,现总结如下。高斯模糊是数字图像模板处理法的一种。其模板是根据二维正态分布(高斯分布)函数计算出来的。
正态分布最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。故名高斯模糊。

实际验证,我们发现这个3*3模板实际上是对高斯半径约为0.849时的一个近似,当r=0.849时,其3*3归一模板为(在MATLAB中,输入 h=fspecial('gaussian', 3, 0.849); 即可得到这个模板):

(guass radius=0.849000)
0.062467 0.125000 0.062467
0.125000 0.250131 0.125000
0.062467 0.125000 0.062467

然后我们可以用Matlab中的imfilter来对图像进行高斯模糊的处理:

img = imread('c:\demo.bmp');
h = fspecial('gaussian', 3, 0.849);
img2 = imfilter(img, h);
subplot(121), imshow(img); title('原图')
subplot(122), imshow(img2); title('高斯模糊后')

效果如下:

我们可以在Matlab中用如下语句绘制高斯曲面:

绘制高斯曲面的Matlab代码

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.gxlcms.com/

--> % 绘制高斯模糊曲面! --------------------
r = 0.849 ; % 高斯半径(从0.1到250)
x =- 3 : 0.2 : 3 ;
y = x;
[X,Y] = meshgrid(x,y);
Z = exp( - (X. ^ 2 + Y. ^ 2 ). / ( 2 * r * r)) / (2 * pi * r * r);
mesh(X,Y,Z)

效果如下图:

在数字信号处理中,高斯模糊算法是一种滤波器,它的时域和频域曲线如下所示:

从频域曲线看出,高斯模糊本质上一种低通滤波器。体现在图像处理上,图像的边缘等灰度变化剧烈的地方对应高频信息,将被滤除。

最后,我们给出计算高斯模糊模板的C语言代码,请注意,由于高斯模板是对称的,实际上我们只需要计算出大约1/4模板即可。但这里的代码我们没有做这样的优化。我们 输出的模板是(2*N+1)*(2N+1),高斯半径用r表示。

计算高斯模板

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.gxlcms.com/

--> #include < math.h >
#include < stdio.h >
#define N 3 /* 模板大小:(2N+1) * (2N+1) */
void main()
{
double a[ 2 * N + 1 ][ 2 * N + 1 ]; /* 高斯模板 */
double r = 0.6 ; /* 高斯半径:[ 0.1, 250] */
double A = 1 / (2 * M_PI * r * r);
int i,j;
for (i =- 1 * N;i <= N;i ++ )
for (j =- 1 * N;j <= N;j ++ )
a[i + N][j + N] = A * exp(( - 1 ) * (i * i + j * j) / ( 2 * r * r));
}

同时,作为比较,我们给出在Matlab中生成高斯模板的代码(fspecial的代码局部,其中p3是第三个参数即高斯半径):

  case 'gaussian' % Gaussian filter

     siz   = (p2-1)/2;  %注:p2即模板边长,默认值为33
     std   = p3;        %注:p3即高斯半径,默认为为0.5
     
     [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
     arg   = -(x.*x + y.*y)/(2*std*std);

     h     = exp(arg);
     h(h<eps*max(h(:))) = 0;

     sumh = sum(h(:));  %注:模板归一化
     if sumh ~= 0,
       h  = h/sumh;
     end; 

更多对Photoshop高斯模糊滤镜的算法总结相关文章请关注PHP中文网!

查看更多关于对Photoshop高斯模糊滤镜的算法总结的详细内容...

  阅读:35次