matlab图像滤波基础

2017-02-14  by:CAE仿真在线  来源:互联网

%% 基础滤波

addpath('F:\A');

file = imread('linker_9.jpg');
if isempty( file )
error('file is empty !');
end
if size(file,3) == 3
img = rgb2gray( file );
else
img = file;
end

%% 均值滤波

filter_avg = fspecial('average',[5 5]); %% 定义一个均值滤波器
filter_gau = fspecial('gaussian', [5 5], 1.0); %% 定义一个高斯滤波器

img_avg = imfilter(img, filter_avg, 'replicate' ); %%让图像通过滤波器
img_gau = imfilter(img, filter_gau, 'replicate' ); %%让图像通过滤波器

% figure;
% imshow( img_avg );
% title( 'img_avg' );
% figure;
% imshow( img_gau );
% title( 'img_gau' );

imwrite(img_avg, 'linker_9_avg.jpg'); %% 默认保存在当前文件夹下
imwrite(img_gau, 'linker_9_gau.jpg'); %% 默认保存在当前文件夹下

%% 中值滤波

% axes(handles.axes2);
% x=(handles.img);


img_salt = imnoise(img, 'salt & pepper', 0.04); %% 加椒盐噪声

img_mid = medfilt2( img_salt(:,:), [5 5], 'symmetric'); %% 图像中值滤波

figure;
imshow( img_mid );
title('img_mid');

imwrite(img_mid, 'lingker_9_mid.jpg');

%% 双边滤波

img1 = im2double( img );

img1_bil = bilateralFilter(img1, 5, [3, 0.1]);

img_bil = im2uint8( img1_bil );

% figure;
% imshow( img_bil );
% title('img_bil');

imwrite(img_bil, 'linker_9_bil.jpg');

===========================================================

%% 双边滤波函数
% A为归一化到[0,1]的图像矩阵
% W为双边滤波器(核)的边长/2
% 定义域方差σd记为SIGMA(1)
% 值域的方差σr记为SIGMA(2)

% 问题: 如何选取合适的方差SIGMA ???

% Pre-process input and select appropriate filter.
function B = bilateralFilter(A, w, sigma)
% Verify that the input image exists and is valid.
if ~exist('A','var') || isempty(A)
error('Input image A is undefined or empty.');
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
% Verify bilateral filter window size.
if ~exist('w','var') || isempty(w) || ...
numel(w) ~= 1 || w < 1
w = 5;
end
% w 向上取整
w = ceil(w);
% Verify bilateral filter standard deviations.
if ~exist('sigma','var') || isempty(sigma) || ...
numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0
sigma = [3 0.1];
end
% Apply either grayscale or color bilateral filtering.
if size(A,3) == 1
B = bfltGray(A, w, sigma(1), sigma(2));
else
B = bfltColor(A, w, sigma(1), sigma(2));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Implements bilateral filtering for grayscale images.
function B = bfltGray(A,w,sigma_d,sigma_r)
%创建核距离矩阵
[X,Y] = meshgrid(-w:w,-w:w);

% 基于距离差的高斯卷积核(固定的)
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
[rows, cols] = size(A);
B = zeros(rows, cols);
for i = 1:rows
for j = 1:cols
% 提取当前核所作用的区域:
% (iMin:iMax,jMin:jMax)
iMin = max(i-w,1);
iMax = min(i+w,rows);
jMin = max(j-w,1);
jMax = min(j+w,cols);
I = A(iMin:iMax,jMin:jMax);
% 基于像素值差的高斯卷积核(变动的)
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
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Implements bilateral filter for color images.
function B = bfltColor(A,w,sigma_d,sigma_r)
% Convert input sRGB image to CIELab color space.
if exist('applycform','file')
A = applycform(A,makecform('srgb2lab'));
else
A = colorspace('Lab<-RGB',A);
end
% Pre-compute Gaussian domain weights.
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
% Rescale range variance (using maximum luminance).
sigma_r = 100*sigma_r;
% Create waitbar.
h = waitbar(0,'Applying bilateral filter...');
set(h,'Name','Bilateral Filter Progress');
% Apply bilateral filter.
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
for j = 1:dim(2)
% Extract local region.
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,:);
% Compute Gaussian range weights.
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));
% Calculate bilateral filter response.
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
% Convert filtered image back to sRGB color space.
if exist('applycform','file')
B = applycform(B,makecform('lab2srgb'));
else
B = colorspace('RGB<-Lab',B); A
end
% Close waitbar.
close(h);


开放分享:优质有限元技术文章,助你自学成才

相关标签搜索:matlab图像滤波基础 MatLab培训 MatLab培训课程 MatLab在线视频教程 MatLab技术学习教程 MatLab软件教程 MatLab资料下载 MatLab代做 MatLab基础知识 Fluent、CFX流体分析 HFSS电磁分析 Ansys培训 Abaqus培训 

编辑
在线报名:
  • 客服在线请直接联系我们的客服,您也可以通过下面的方式进行在线报名,我们会及时给您回复电话,谢谢!
验证码

全国服务热线

1358-032-9919

广州公司:
广州市环市中路306号金鹰大厦3800
电话:13580329919
          135-8032-9919
培训QQ咨询:点击咨询 点击咨询
项目QQ咨询:点击咨询
email:kf@1cae.com