用MATLAB实现频域平滑滤波以及图像去噪代码

用MATLAB实现频域平滑滤波以及图像去噪代码,第1张

%%%%%%%%spatial frequency (SF) filtering by low pass filter%%%%%%%%

% the SF filter is unselective to orientation (doughnut-shaped in the SF

% domain).

[FileName,PathName,FilterIndex] = uigetfile

filename = fullfile(PathName, FileName)

[X map] = imread(filename, fmt)% read image

L = double(X)% transform to double

%%%%%%%%%%%%% need to add (-1)x+y to L

% calculate the number of points for FFT (power of 2)

fftsize = 2 .^ ceil(log2(size(L)))

% 2d fft

Y = fft2(X, fftsize(1), fftsize (2))

Y = fftshift(Y)

% obtain frequency (cycles/pixel)

f0 = floor([m n] / 2) + 1

fy = ((m: -1: 1) - f0(1) + 1) / m

fx = ((1: n) - f0(2)) / n

[mfx mfy] = meshgrid(fx, fy)

% calculate radius

SF = sqrt(mfx .^ 2 + mfy .^ 2)

% SF-bandpass and orientation-unselective filter

filt = SF >k0

A_filtered = filt .* A% SF filtering

L_filtered = real(ifft2(ifftshift(A_filtered)))% IFFT

L_filtered = L_filtered(1: size(L, 1), 1: size(L, 2))

%%%%%%%%%%need to add (-1)x + y to L_filtered

% show

figure(1)

clf reset

colormap gray

% plot image

subplot(2, 2, 1)

imagesc(L)

colorbar

axis square

set(gca, 'TickDir', 'out')

title('original image')

xlabel('x')

ylabel('y')

imwrite(L, fullfile(FilePath, 'original image.bmp'), 'bmp')

% plot amplitude

A = abs(A)

A = log10(A)

% spectral amplitude

subplot(2, 2, 2)

imagesc(fx, fy, A)

axis xy

axis square

set(gca, 'TickDir', 'out')

title('amplitude spectrum')

xlabel('fx (cyc/pix)')

ylabel('fy (cyc/pix)')

imwrite(A, fullfile(FilePath, 'amplitude spectrum.bmp'), 'bmp')

% filter in the SF domain

subplot(2, 2, 3)

imagesc(fx, fy, filt)

axis xy

axis square

set(gca, 'TickDir', 'out')

title('filter in the SF domain')

xlabel('fx (cyc/pix)')

ylabel('fy (cyc/pix)')

imwrite(filt, fullfile(FilePath, 'filter in SF.bmp'), 'bmp')

% filtered image

subplot(2, 2, 4)

imagesc(L_filtered)

colorbar

axis square

set(gca, 'TickDir', 'out')

title('filtered image')

xlabel('x')

ylabel('y')

imwrite(filtered, fullfile(FilePath, 'filtered image.bmp'), 'bmp')

%%%%%%%%%%%%%%%%%median filter%%%%%%%%%%%%%%%%

[FileName,PathName,FilterIndex] = uigetfile

filename = fullfile(PathName, FileName)

[LNoise map] = imread(filename, fmt)% read image

L = medfilt2(LNoise, [3 3])% remove the noise with 3*3 block

figure

imshow(LNoise)

title('image before fitlering')

figure

imshow(L)

title('filtered image')

imwrite(FilePath, 'filtered image.bmp', bmp)

平滑滤波

低频增强的空间域滤波技术

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

中文名

平滑滤波

外文名

Smoothing

拼音

píng huá lǜ bō

注音

ㄆㄧㄥˊ ㄏㄨㄚˊㄌㄩˋ ㄅㄛ

滤波目的处理要求滤波原因滤波方法其他方式TA说

滤波目的

滤波的本义是指信号有各种频率的成分,滤掉不想要的成分,即为滤掉常说的噪声,留下想要的成分.这即是滤波的过程,也是目的.

一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

处理要求

一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

滤波原因

各类图像处理系统在图像的采集、获取、传送和转换(如成像、复制扫描、传输以及显示等)过程中,均处在复杂的环境中,光照、电磁多变,所有的图像均不同程度地被可见或不可见的噪声干扰。噪声源包括电子噪声、光子噪声、斑点噪声和量化噪声。如果信噪比低于一定的水平,噪声逐渐变成可见的颗粒形状,导致图像质量的下降。除了视觉上质量下降,噪声同样可能掩盖重要的图像细节,在对采集到的原始图像做进一步的分割处理时,我们发现有一些分布不规律的椒盐噪声,为此采取相应的对策就是对图像进行必要的滤波降噪处理。

滤波方法

图像的噪声滤波器有很多种,常用的有线性滤波器,非线性滤波器。采用线性滤波如邻域平滑滤波,对受到噪声污染而退化的图像复原,在很多情况下是有效的。但大多数线性滤波器具有低通特性,去除噪声的同时也使图像的边缘变模糊了。而另一种非线性滤波器如中值滤波,在一定程度上可以克服线性滤波器所带来的图像模糊问题,在滤除噪声的同时,较好地保留了图像的边缘信息。

邻域平滑滤波原理

邻域平均法[2]是一种利用Box模版对图像进行模版 *** 作(卷积运算)的图像平滑方法,所谓Box模版是指模版中所有系数都取相同值的模版,常用的3×3和5×5模版如下:

邻域平均法的数学含义是:

(式4-1)

式中:x,y=0,1,…,N-1S是以(x,y)为中心的邻域的集合,M是S内的点数。

邻域平均法的思想是通过一点和邻域内像素点求平均来去除突变的像素点,从而滤掉一定噪声,其优点是算法简单,计算速度快,其代价会造成图像在一定程度上的模糊。

中值滤波原理

中值滤波[2]就是用一个奇数点的移动窗口,将窗口的中心点的值用窗口内的各点中值代替。假设窗口内有五点,其值为80、90、200、110和120,那么此窗口内各点的中值及为110。

设有一个一维序列f1,f2,…,fn,取窗口长度(点数)为m(m为奇数),对其进行中值滤波,就是从输入序列中相继抽出m个数fi-v,…,fi-1,fi,fi+1,…,fi+v(其中fi为窗口中心值,v=(m-1)/2),再将这m个点按其数值大小顺序排序,取其序号的中心点的那个数作为滤波输出。数学公式表示为:

Yi=Med{fi-v,…,fi-1,fi,fi+1,…,fi+v} i∈N v=(m-1)/2 (式4-2)

Yi称为序列fi-v,…,fi-1,fi,fi+1,…,fi+v的中值

例如,有一序列{0,3,4,0,7},重新排序后为{0,0,3,4,7}则Med{0,0,3,4,7}=3。此列若用平滑滤波,窗口也取5,那么平滑滤波输出为(0+3+4+0+7)/5=2.8。

把一个点的特定长度或形状的邻域称作窗口。在一维情况下,中值滤波器是一个含有奇数个像素的滑动窗口。中值滤波很容易推广到二维,此时可以利用二维形式的窗口。

对于平面图像采用的二维中值滤波可以由下式表示:

(式4-3)

式中:A为窗口,{fij}为二维数据序列,即数字图像各点的灰度值。

对于本系统,由于采集到的是24位真彩色图像,每个像素点分别有R、G、B三个灰度分量,故要在窗口内分别找到这三个分量的中值,分别用这三个中值去代替窗口中心像素点的R、G、B三个灰度分量的值。

clear

clc

x=randn(1,100)

%x为要滤波的信号

m=5%表示平滑滤波窗长度,这是长度为奇数的情况

%前m/2,最后m/2个点没滤波,设为原来的值就行

for i=1:length(x)-m+1

y(i+(m-1)/2)=sum(x(i:i+m-1))/m

end

figure(1)

plot(x,'r')hold onplot(y,'g')hold off

这是最简单的,不知道你需要基于什么算法的平滑滤波!有重心法的,算术滑动平均的,变参数双指数平滑方法,还有用插值的方式去平滑的


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8166122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存