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培训
编辑