数字图像处理(三):高斯滤波和双边滤波

1.高斯滤波

clear all;clc;close all
%% 彩色to灰度
img=imread(‘Fig0631(a)(strawberries_coffee_full_color).jpg‘);
gray=rgb2gray(img);                                     %把彩色图片转化成灰度图片
figure(1),imshow(gray),title(‘彩色原始图像转灰色图像)‘); %显示原始图像
gray=imnoise(gray,‘gaussian‘,0,0.001);                  %加入均值为0,方差为0.001的高斯噪声
figure(2),imshow(gray),title(‘加入高斯噪声之后的图像‘);   %显示加入高斯噪声之后的图像
%% 用matlab系统函数进行高斯滤波
sigma=0.5;                                                %滤波器的标准值,单位为像素
hsize=[3 3];                                              %模板尺寸
gsseq=fspecial(‘gaussian‘,hsize,sigma);                   %生成高斯序列
Y1=filter2(gsseq,gray)/255;                               %用生成的高斯序列进行滤波
figure(3),imshow(Y1),title(‘用Matlab自带函数进行高斯滤波‘); %显示滤波后的图像
%% 用重新编写的程序进行高斯滤波
gray=double(gray);                %将图像转为double型
gray=fft2(gray);                  %二维傅立叶变换
gray=fftshift(gray);              %频谱居中
[m,n]=size(gray);                 %计算图像大小
d0=80;                            %D0=sigma,也就是标准差
m1=fix(m/2);                      %计算图像中心
n1=fix(n/2);                      %计算图像中心
for i=1:m
    for j=1:n
        d=sqrt((i-m1)^2+(j-n1)^2);%计算像素点到图像中心的距离
        h(i,j)=exp(-d^2/2/d0^2);  %高斯滤波器
    end
end
g=gray.*h;                        %将图像进行高斯滤波,频域上表现为为两个函数相乘
g=ifftshift(g);                   %频域圆周移位
g=ifft2(g);                       %二维傅里叶反变换
g=mat2gray(real(g));              %归一化
figure(4),imshow(g),title(‘用重新编写的程序进行高斯滤波‘);%显示滤波后的图像

2.双边滤波

%双边滤波调用示例
I=imread(‘Fig0427(a)(woman).jpg‘); %读入图片
I=double(I)/255;  %转为double型并归一化
w     = 5;        % 双边滤波器半宽,w越大平滑作用越强
sigma = [3 0.1];  % 空间距离方差σd记为SIGMA(1),像素亮度方差σr记为SIGMA(2),即空间邻近度因子和亮度相似度因子的衰减程度
I1=bfilter2(I,w,sigma);                     %双边滤波器滤波
figure(1),imshow(I),title(‘原始图像‘);       %作出原始图像
figure(2),imshow(I1),title(‘双边滤波后的图像‘)%作出双边滤波后的图像
function B = bfltGray(A,w,sigma_d,sigma_r)
% 计算距离因子权重
[X,Y] = meshgrid(-w:w,-w:w);
%创建核距离矩阵
%e.g.
%[x,y]=meshgrid(-1:1,-1:1)
%
% x =
%
%     -1     0     1
%     -1     0     1
%     -1     0     1
%
%
% y =
%
%     -1    -1    -1
%      0     0     0
%      1     1     1

%计算定义域核
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));

%创建进度条
h = waitbar(0,‘Applying bilateral filter...‘);
set(h,‘Name‘,‘Bilateral Filter Progress‘);

% 应用双边滤波
%计算值域核H 并与定义域核G 乘积得到双边权重函数F
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
   for j = 1:dim(2)
         %边界限制
         iMin = max(i-w,1);
         iMax = min(i+w,dim(1));
         jMin = max(j-w,1);
         jMax = min(j+w,dim(2));

         %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)
         I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I

         % 计算亮度因子权重
         H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));

         % 计算双边滤波结果
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
         B(i,j) = sum(F(:).*I(:))/sum(F(:));

   end
   waitbar(i/dim(1));
end
% 结束进度条
close(h);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 对彩色图像进行双边滤波操作
function B = bfltColor(A,w,sigma_d,sigma_r)

% 将sRGB转换为CIELab色彩空间
if exist(‘applycform‘,‘file‘)
   A = applycform(A,makecform(‘srgb2lab‘));
else
   A = colorspace(‘Lab<-RGB‘,A);
end

% 计算空间距离因子权重
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));

% 调整亮度因子权重
sigma_r = 100*sigma_r;

% 创建进度条
h = waitbar(0,‘Applying bilateral filter...‘);
set(h,‘Name‘,‘Bilateral Filter Progress‘);

% 应用双边滤波
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
   for j = 1:dim(2)
         % 边界限制
         iMin = max(i-w,1);
         iMax = min(i+w,dim(1));
         jMin = max(j-w,1);
         jMax = min(j+w,dim(2));
         I = A(iMin:iMax,jMin:jMax,:);

         % 计算亮度因子权重
         dL = I(:,:,1)-A(i,j,1);
         da = I(:,:,2)-A(i,j,2);
         db = I(:,:,3)-A(i,j,3);
         H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));

         % 计算双边滤波结果
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
         norm_F = sum(F(:));
         B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F;
         B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F;
         B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;

   end
   waitbar(i/dim(1));
end

% 将图像转换为sRGB色彩空间.
if exist(‘applycform‘,‘file‘)
   B = applycform(B,makecform(‘lab2srgb‘));
else
   B = colorspace(‘RGB<-Lab‘,B);
end

% 结束进度条
close(h);
%A为给定图像,归一化到[0,1]的矩阵
%w为双边滤波器(核)的边长/2
%定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function B = bfilter2(A,w,sigma)
% 检验给定图像是否存在并且有效
if ~exist(‘A‘,‘var‘) || isempty(A)
   error(‘Input image A is undefined or invalid.‘);
end
if ~isfloat(A) || ~sum([1,3] == size(A,3)) || ...
      min(A(:)) < 0 || max(A(:)) > 1
   error([‘Input image A must be a double precision ‘,...
          ‘matrix of size NxMx1 or NxMx3 on the closed ‘,...
          ‘interval [0,1].‘]);
end

% 检验双边滤波器的半宽是否符合要求
if ~exist(‘w‘,‘var‘) || isempty(w) || ...
      numel(w) ~= 1 || w < 1
   w = 5;
end
w = ceil(w);

% 检验sigma参数是否符合要求
if ~exist(‘sigma‘,‘var‘) || isempty(sigma) || ...
      numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0
   sigma = [3 0.1];
end

%选择彩色模式或灰度模式
if size(A,3) == 1
   B = bfltGray(A,w,sigma(1),sigma(2));
else
   B = bfltColor(A,w,sigma(1),sigma(2));
end
时间: 2024-08-08 04:04:51

数字图像处理(三):高斯滤波和双边滤波的相关文章

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

【OPENCV入门之六】非线性滤波(中值滤波、双边滤波)

参考网站: http://blog.csdn.net/poem_qianmo/article/details/23184547 在很多情况下,比如在噪声是散粒噪声而不是高斯噪声时(图像偶尔会出现很大的值的时候),在这种情况下,用高斯滤波器对图像进行模糊的话,噪声是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒.而用非线性滤波会更好些. 1.中值滤波(Median filter)--medianBlur函数 该方法在去除脉冲噪声.斑点噪声(speckle noise).椒盐噪声(salt-a

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)

python数字图像处理(10):图像滤波

对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声:另一种是微分算子,可以用来检测边缘和特征提取. skimage库中通过filters模块进行滤波操作. 1.sobel算子 sobel算子可用来检测边缘 函数格式为:skimage.filters.sobel(image, mask=None) from skimage import data,filters import matplotlib.pyplot as plt img = data.camera() edges = fil

非线性滤波:中值滤波;双边滤波

1 中值滤波:medianBlur 2 双边滤波:bilateralFilter 原文地址:https://www.cnblogs.com/shuguomeifuguo/p/11966201.html

【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

原文:http://blog.csdn.net/xiaowei_cqu/article/details/7785365 邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素: 其中权重核   为“滤波系数”.上面的式子可以简记为: [方框滤波] 最简单的线性滤波是移动平均或方框滤波,用 窗口中的像素值平均后输出,核函数

学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤波","高斯滤波"三种常见的邻域滤波操作.而作为非线性滤波的"中值滤波"和"双边滤波",我们下次再分析. 因为文章很长,如果详细啃的话,或许会消化不良.在这里给大家一个指引,如果是单单想要掌握这篇文章中讲解的OpenCV线性滤波相关的三个函

Bilateral Filtering(双边滤波) for SSAO

原网址:http://blog.csdn.net/bugrunner/article/details/7170471 1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪.Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用.一般的高斯模糊在进行采样