高斯滤波

原创 2013年12月04日 23:26:45

1.通过调整高斯函数的标准差(sigma)来控制平滑程度;
2.滤波窗口大小取为[6*sigma-1]/2*2+1[.]表示取整;
3.利用二维高斯函数的行列可分离性进行加速;
•先对每行进行一维高斯滤波,再对结果的每列进行同样的一维高斯滤波;

clear;
tic;
P=imread('H:/数字图像处理/13_input.jpg');
%subplot(131);
imshow(P),title('原图像');
P=imnoise(P,'salt & pepper',0.02);
%subplot(132);b9g
figure;
imshow(P),title('加入高斯噪声后的图片');
P=double(P);
[nrows ncols p]=size(P);
OUT = uint8(zeros(nrows,ncols,p));%输出图像
sigma=str2double(inputdlg('请输入高斯滤波器的标准差', 'INPUT scale factor', 1, {'2.5'}));
c=floor(6*sigma-1)/2*2+1;
k=floor((c+1)/2);%计算图象中心
a=zeros(c);
sum=0;
for i=1:c
    a(i)= exp(-((i-k).^2)/(2*sigma^2))/(sqrt(2*3.1415926*sigma));
    sum=sum+a(i);
end
for m=1:c  %归一化
    a(m)=a(m)/sum;
end

nLen=(c-1)/2;
if p==1 %处理灰度图像
  %x方向滤波
  for y=1:ncols 
      for x=1-nLen:nrows-nLen  
          dDotMul = 0;  
          dWeightSum = 0;  
          for i=-nLen:nLen             
                %判断是否在图像内部  
                if((i+x)>=1 && (i+x)<nrows)                  
                    dDotMul=dDotMul+(P(i+x,y) * a(nLen+i+1));  
                    dWeightSum =dWeightSum+ a(nLen+i+1);  
                end
           end
           OUT(i+x,y) = dDotMul/dWeightSum;  
      end        
  end 
  %y方向滤波
  for x=1:nrows 
      for y=1-nLen:ncols-nLen  
          dDotMul = 0;  
            dWeightSum = 0;  
            for i=-nLen:nLen             
                %判断是否在图像内部  
                if((i+y)>=1 && (i+y)<ncols)                  
                    dDotMul=dDotMul+(OUT(x,i+y) * a(nLen+i+1));  
                    dWeightSum =dWeightSum+ a(nLen+i+1);  
                end
            end
            P(x,i+y) = dDotMul/dWeightSum;  
      end        
  end 
  OUT=P;
end

if p==3  %处理真彩色
    R = P(:,:,1);
    G = P(:,:,2);
    B = P(:,:,3);
    RR = uint8(zeros(nrows,ncols));
    GG = uint8(zeros(nrows,ncols));
    BB = uint8(zeros(nrows,ncols));
   %x方向滤波
   for y=1:ncols 
      for x=1-nLen:nrows-nLen  
            dDotMul_R = 0;
            dDotMul_G = 0;
            dDotMul_B = 0;
            dWeightSum = 0;  
            for i=-nLen:nLen             
                %判断是否在图像内部  
                if((i+x)>=1 && (i+x)<=nrows)                  
                    dDotMul_R=dDotMul_R+(R(i+x,y) * a(nLen+i+1));
                    dDotMul_G=dDotMul_G+(G(i+x,y) * a(nLen+i+1));
                    dDotMul_B=dDotMul_B+(B(i+x,y) * a(nLen+i+1));
                    dWeightSum =dWeightSum+ a(nLen+i+1);  
                end
            end
            RR(i+x,y) = dDotMul_R/dWeightSum;  
            GG(i+x,y) = dDotMul_G/dWeightSum;
            BB(i+x,y) = dDotMul_B/dWeightSum;
      end        
   end  
  %y方向滤波
  for x=1:nrows 
      for y=1-nLen:ncols-nLen  
            dDotMul_R = 0;
            dDotMul_G = 0;
            dDotMul_B = 0;
            dWeightSum = 0;  
            for i=-nLen:nLen             
                %判断是否在图像内部  
                if((i+y)>=1 && (i+y)<=ncols)                  
                    dDotMul_R=dDotMul_R+(RR(x,i+y) * a(nLen+i+1));
                    dDotMul_G=dDotMul_G+(GG(x,i+y) * a(nLen+i+1));
                    dDotMul_B=dDotMul_B+(BB(x,i+y) * a(nLen+i+1));
                    dWeightSum =dWeightSum+ a(nLen+i+1);  
                end
            end
            R(x,i+y) = dDotMul_R/dWeightSum;  
            G(x,i+y) = dDotMul_G/dWeightSum;
            B(x,i+y) = dDotMul_B/dWeightSum;
      end        
  end 
  OUT(:,:,1) = R;
  OUT(:,:,2) = G;
  OUT(:,:,3) = B;
end
%subplot(133);
figure;
imshow(OUT);
title('高斯滤波去噪结果');
toc;



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Qt5.7OpenCV249高斯滤波

  • 2017年01月12日 14:41
  • 5KB
  • 下载

自编高斯滤波

  • 2014年10月18日 08:04
  • 365B
  • 下载

Opencv学习(1):高斯滤波

快乐虾@http://blog.csdn.net/lights_joy/欢迎转载,但请保留作者信息本文适用于opencv3.0.0, vs2013Opencv中提供了高斯滤波函数:/** @brief...

3X3高斯滤波,模糊等图像处理

  • 2010年01月22日 15:37
  • 1.53MB
  • 下载

高斯滤波的简介

  • 2015年12月22日 16:38
  • 6KB
  • 下载

CUDA卷积操作—使用constant memory实现高斯滤波

高斯滤波就是使用高斯模板和图片进行卷积运算,高斯函数及模板如下图所示: 卷积前后的效果图如下: GPU代码如下所示: #include "cuda_runtime.h" #include ...

高斯滤波递归实现

  • 2016年01月20日 21:33
  • 530KB
  • 下载

高斯滤波

  • 2015年06月10日 17:06
  • 31KB
  • 下载

Java+opencv3.2.0之高斯滤波

高斯滤波器是利用高斯核的一个二维的卷积算子,用于图像模糊去噪。它也是一种线性滤波器,其模板系数会随着距离模板中心越远而越小。高斯滤波的结果和高斯分布的标准差σ有关,σ越大,平滑效果越好。高斯滤波的具体...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高斯滤波
举报原因:
原因补充:

(最多只允许输入30个字)