图像的滤波与图像增强的Matlab实现

简介: 图像的滤波与图像增强的Matlab实现
文章和代码以及样例图片等相关资源,已经归档至【Github仓库: digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。

目的

  1. 了解 MATLAB 工具箱中的滤波器。
  2. 掌握空间滤波
  3. 学会对图像的空间变换

内容

A. 用滤波器祛除图象噪声

在数字图像处理中,常常会遇到图像中混杂有许多的噪声。因此,在进行图像处理中,有时要先进行祛除噪声的工作。最常用的祛除噪声的方法是用滤波器进行滤波处理。MATLAB 的图像处理工具箱里也设计了许多的滤波器。如均值滤波器、中值滤波器、维纳滤波器等。

(分别用均值滤波,中值滤波,及维纳滤波器祛除加入高斯噪声的图象)

I=imread('D:\pic\DIP3E_CH04\FigP0438(left).tif ');
J=imnoise(I,'gaussian',0,0.002);
%进行均值滤波
h=fspecial('average',3);
I2=uint8(round(filter2(h,I)));
%进行中值滤波
I3=medfilt2(J,[3,3]);
%进行维纳滤波
I4=wiener2(J,[3,3]); %进行一次维纳滤波
I5=wiener2(I4,[3,3]);%进行二次维纳滤波
subplot(2,3,1),imshow(I),title('原图象')
subplot(2,3,2),imshow(J),title('加噪声图象')
subplot(2,3,3),imshow(I2),title('均值滤波后图象')
subplot(2,3,4),imshow(I3),title('中值滤波后图象')
subplot(2,3,5),imshow(I4),title('维纳滤波后图象')
subplot(2,3,6),imshow(I5),title('两次维纳滤波后图象')

B. 空间噪声滤波器

%用函数imnoise2 生成具有表5.1 中的CDF 的随机数
function R=imnoise2(type,M,N,a,b)
if nargin ==1
    a=0;b=1;
    M=1;N=1;
elseif nargin ==3
    a=0;b=1;
end
switch lower(type)
    case 'uniform'
        R=a+(b-a)*rand(M,N);
    case 'gaussian'
        R=a+b*randn(M,N);
    case 'salt & pepper'
        if nargin <=3
            a=0.05;b=0.05;
        end
        if (a+b)>1;
            error('The sum Pa+Pb must not exceed 1.')
        end
        R(1:M, 1:N) = 0.5;
        X=rand(M,N);
        c=find(X<=a);
        R(c)=0;
        u=a+b;
        c=find(X>a & X<=u);
        R(c)=1;
    case 'rayleigh'
        R=a+(-b*log(1-rand(M,N))).^0.5;
    case 'exponential'
        if nargin <=3;
            a=1;
        end
        if a<=0
            error('Parameter a must be positive for exponential type.')
        end
        k=-1/a;
        R=k*log(1-rand(M,N));
    case 'erlang'
        if nargin<=3
            a=2;b=5;
        end
        if (b~=round(b)|b<=0)
            error('Parameter b must be a positive integer for Erlang')
        end
        k=-1/a;
        R=zeros(M,N);
        for j=1:b
            R=R+k*log(1-rand(M,N));
        end
    otherwise
        error('unknown distribution type.')
end

function image=changeclass(class,varargin)
switch class
    case 'uint8'
        image=im2uint8(varargin{:});
    case 'uint16'
        image=im2uint16(varargin{:});
    case 'double'
        image=im2double(varargin{:});
    otherwise
        error('Unsupported IPT data class.');
end
%%%%% spfilt 函数与表中列出的任何滤波器在空间域执行滤波。
function f = spfilt(g,type,m,n,parameter)
if nargin ==2
    m=3;n=3;Q=1.5;d=2;
elseif nargin == 5
    Q=parameter;d=parameter;
elseif nargin== 4
    Q=1.5; d=2;
else
    error ('wrong number of inputs');
end
switch type
    case 'amean'
    w=fspecial('average',[m,n]);
    f=imfilter(g,w, 'replicate');
    case 'gmean'
    f=gmean(g,m,n);
    case 'hmean'
    f=harmean(g,m,n);
    case 'chmean'
    %f=charmean(g,m,n,Q);
    f=charmean(g,m,n,Q);
    case 'median'
    f=medfilt2(g,[m n], 'symmetric');
    case 'max'
    f=ordfilt2(g,m*n,ones(m,n),'symmetric');
    case 'min'
    f=ordfilt2(g,1,ones(m,n), 'symmetric');
    case 'midpoint'
    f1=ordfilt2(g,1,ones(m,n), 'symmetric');
    f2=ordfilt2(g,m*n,ones(m,n), 'symmetric');
    f=imlincomb(0.5,f1,0.5,f2);
    case 'atrimmed'
    if(d<0)|(d/2~=round(d/2))
        error('d must be a nonnegative, even integer.')
    end
    f=alphatrim(g,m,n,d);
    otherwise
        error('Unknown filter type.')
end


function f=gmean(g,m,n)
inclass =class (g);
g=im2double(g);
warning off;
f=exp(imfilter(log(g),ones(m,n),'replicate')).^(1/m/n);
warning on;
f=changeclass(inclass, f);


function f=harmean(g,m,n)
inclass=class(g);
g=im2double(g);
f=m*n./imfilter(1./(g+eps),ones(m,n),'replicate');
f=changeclass(inclass,f);

function f=charmean(g,m,n,q)
inclass=class(g);
g=im2double(g);
f= imfilter(g.^(q+1),ones(m,n),'replicate');
f=f./ (imfilter(g.^q,ones(m,n),'replicate')+eps);
f=changeclass(inclass,f);

function f=alphatrim(g,m,n,d)
inclass = class(g);
g=im2double(g);
f=imfilter(g,ones(m,n),'symmetric');
for k=1:d/2
    f=imsubtract(f,ordfilt2(g,k,ones(m,n),'symmetric'));
end
for k=(m*n – (d/2)+1):m*n
    f=imsubtract(f,ordfilt2(g,k,ones(m,n),'symmetric'));
end
f=f/(m*n-d);
f=changeclass(inclass,f);

%使用函数spfilt
clear all
clc
f=imread('D:\pic\DIP3E_CH04\FigP0438(left).tif');
[M,N]=size(f);
R=imnoise2('salt & pepper',M,N,0.1,0);%被概率只有0.1 的胡椒噪声污染
c=find(R==0);
gp=f;
gp(c)=0;
figure, imshow(gp);

R=imnoise2('salt & pepper',M,N,0,0.1);
c=find(R==1);
gs=f;
gs(c)=255;
figure,imshow(gs)

fp=spfilt(gp,'chmean',3,3,1.5);%使用Q 为正值的反调和滤波器
figure, imshow(gp);
fs=spfilt(gs,'chmean',3,3,-1.5);
figure, imshow(gs);

fpmax=spfilt(gp,'max',3,3); %使用最大最小滤波器
figure, imshow(gp);
fsmin=spfilt(gs,'min',3,3);
figure, imshow(gs);

C.用滤波器祛除图象噪声

%产生一个等角变换用于测试图像
f=checkerboard(50);
s=0.8;
theta=pi/6;
T=[s*cos(theta) s*sin(theta) 0; -s*sin(theta) s*cos(theta) 0; 0 0 1];
tform=maketform('affine',T);
g=imtransform(f,tform);
figure, imshow(g);

g2=imtransform(f,tform,'nearest');
figure, imshow(g2);

g3=imtransform(f,tform,'FillValue',0.5);
figure, imshow(g3);

T2=[1 0 0;0 1 0; 50 50 1];
tform2=maketform('affine',T2);
g4=imtransform(f,tform2);
figure, imshow(g4);

g5=imtransform(f,tform2,'XData',[1 400],'YData',[1
400],'FillValue',0.5);
figure, imshow(g5);

参考文献:

[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.

[2] 阮秋琦. 数字图像处理(MATLAB版)[M]. 北京:电子工业出版社, 2014..pdf)

[3] 冈萨雷斯. 数字图像处理(第三版)[M]. 北京:电子工业出版社, 2011..pdf)

目录
相关文章
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 人机交互 数据安全/隐私保护
基于图像形态学处理和凸包分析法的指尖检测matlab仿真
本项目基于Matlab2022a实现手势识别中的指尖检测算法。测试样本展示无水印运行效果,完整代码含中文注释及操作视频。算法通过图像形态学处理和凸包检测(如Graham扫描法)来确定指尖位置,但对背景复杂度敏感,需调整参数PARA1和PARA2以优化不同手型的检测精度。
|
4月前
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。
|
5月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
7月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
507 12
|
7月前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。
|
6月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
272 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
6月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
162 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
6月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
138 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章