首页 > 编程知识 正文

巴特沃斯低通滤波器原理,二阶巴特沃斯低通滤波器

时间:2023-05-05 20:48:34 阅读:121048 作者:1170

1.低通滤波器

低通滤波器对频域图像中的高频部分进行滤波,使低频部分通过。 图像的边缘和噪声与频域图像中的高频部分相对应,低通滤波器的作用是削弱该部分的能量,目的是实现图像的平滑去噪。

2.理想低通滤波器

最简单的低通滤波器是理想的低通滤波器,其基本思想是提供频率阈值,所有高于阈值的部分都设置为0,而低于阈值的部分保持不变。

理想是指该滤波器不能用电子元器件来实现,但是可以通过计算机来模拟。

VTK定义了理想的低通滤波器。 下面,我们来看看如何使用此过滤器对图像执行低通滤波器:

//理想低通滤波器# includevtksmartpointer.h # includevtkjpegreader.h # includevtkimagefft.h # includevtkimageidealllowpass includevtkimagecast.h # includevtkimageextractcomponents.h # includevtkimageactor.h # includevtkimageactor.h # include includevtkrenderwindowinteractor.hint main ({ vtksmartpointervtkjpegreaderreader=vtksmartpoointervtkjpegreader reader-ST reader-Update (; tksmartpointervtkimagefftfftfilter=vtksmartpointervtkimagefft 33603360 new (; ft滤波器设置连接(reader-getoutputport ); FFT过滤器- update (; tksmartpointervtkimageideallowpasslowpassfilter=vtksmartpointervtkimageideallowpass 3360: new (; 低路径过滤器-设置连接(FFT过滤器- getoutputport ) ); 低路径过滤器- setx cut off (0.05; //xy设置低通滤波器设置(0.05 )的截止频率; 低路径过滤器-更新(; vtksmartpointervtkimagerfftrfftfilter=vtksmartpointervtkimagerfft 33603360 new (; //将处理后的频域图像转换为空域图像,rfftfilter-setinputconnection (low pass filter-getoutputport ); //注意:变换后图像的各像素值为复数; rfftFilter-Update (; tksmartpointervtkimageextractcomponentsifftextractreal=vtksmartpointervtkimageextractcomponents 3360: new (; ifftextractreal-setinputconnection (rfftfilter-getoutputport (); ifftextractreal-set components (0; //实部定量vtksmartpointervtkimagecastcastfilter=vtksmartpointervtkimagecast 33603360 new (; //将数据类型设置为无符号字符型cast filter-setinputconnection (ifftextractreal-getoutputport ); cast过滤器- setoutputscalartypetounsignedchar (; castFilter-Update (; vtksmartpointervtkimageactororiginalactor=vtksmartpointervtkimageactor 33603360 new (; 原始操作者-设置输入数据(reader-get output ) ); vtkSmartPointervtkImageActo

r> erodedActor = vtkSmartPointer<vtkImageActor>::New();erodedActor->SetInputData(castFilter->GetOutput());double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer = vtkSmartPointer<vtkRenderer>::New();leftRenderer->AddActor(originalActor);leftRenderer->ResetCamera();leftRenderer->SetViewport(leftViewport);leftRenderer->SetBackground(1.0, 0, 0);vtkSmartPointer<vtkRenderer> rightRenderer = vtkSmartPointer<vtkRenderer>::New();rightRenderer->AddActor(erodedActor);rightRenderer->SetViewport(rightViewport);rightRenderer->ResetCamera();rightRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(rightRenderer);renderWindow->AddRenderer(leftRenderer);renderWindow->SetSize(540, 320);renderWindow->SetWindowName("Frequency_IdealLowPassFilter");vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);renderWindow->Render();interactor->Start();return 0;}

运行结果如下:

从结果看,在过滤掉图像的高频部分后,图像变得模糊,丢失了许多细节,另外还可以看到图像会存在一定的振铃效应,这也是理想低通滤波的特点

首先读入一副图像,通过vtkImageFFT将图像转换到频域空间。vtkImageIdealLowPass对频域图像做理想低通滤波,需要用户设置每个方向的截断频率,相应的设置函数SetXCutOff()和SetYCutOff()。执行完毕后,需要通过vtkImageRFFT将处理后的频域图像转换至空域图像。需要注意的是,转换后的图像每个像素都是一个复数,需要vtkImageExtractComponents将该图像的第一个分量提出出来显示,否则图像不能正确显示。由于傅里叶变换输入输出的数据类型都是double,为了方便显示,还需要将其转换为Unsigned char类型,这里vtkImageCast负责类型转换。
3.喜悦的玫瑰低通滤波器

在实际中经常使用的是tmdyg滤波器。tmdyg滤波器对应的转移函数(可以看做是一个系数矩阵)是:

                                                  

其中D(u,v)表示频域点(u,v)到频域图像原点的距离,称为截止频率,当D(u,v) = 时,H(u,v)=0.5,即对应的频域能量将为原来的一半。因为tmdyg低通滤波器在高低频间的过渡平滑,因此不会出现明显的振铃效应。VTK中实现tmdyg低通滤波器的类是vtkImageButterworthLowPass.

/***********************喜悦的玫瑰低通滤波器*****************************************/#include <vtkSmartPointer.h>#include <vtkJPEGReader.h>#include <vtkImageFFT.h>#include <vtkImageButterworthLowPass.h>#include <vtkImageRFFT.h>#include <vtkImageExtractComponents.h>#include <vtkImageCast.h>#include <vtkImageActor.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleImage.h>int main(){vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("data\lena-gray.jpg");reader->Update();vtkSmartPointer<vtkImageFFT> fftFilter = vtkSmartPointer<vtkImageFFT>::New();fftFilter->SetInputConnection(reader->GetOutputPort());fftFilter->Update();vtkSmartPointer<vtkImageButterworthLowPass> lowPassFilter = vtkSmartPointer<vtkImageButterworthLowPass>::New();lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());lowPassFilter->SetXCutOff(0.05);lowPassFilter->SetYCutOff(0.05);lowPassFilter->Update();vtkSmartPointer<vtkImageRFFT> rfftFilter = vtkSmartPointer<vtkImageRFFT>::New();rfftFilter->SetInputConnection(lowPassFilter->GetOutputPort());rfftFilter->Update();vtkSmartPointer<vtkImageExtractComponents> ifftExtractReal = vtkSmartPointer<vtkImageExtractComponents>::New();ifftExtractReal->SetInputConnection(rfftFilter->GetOutputPort());ifftExtractReal->SetComponents(0);vtkSmartPointer<vtkImageCast> castFilter = vtkSmartPointer<vtkImageCast>::New();castFilter->SetInputConnection(ifftExtractReal->GetOutputPort());castFilter->SetOutputScalarTypeToUnsignedChar();castFilter->Update();vtkSmartPointer<vtkImageActor> originalActor = vtkSmartPointer<vtkImageActor>::New();originalActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> erodedActor = vtkSmartPointer<vtkImageActor>::New();erodedActor->SetInputData(castFilter->GetOutput());///double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->AddActor(originalActor);leftRenderer->SetViewport(leftViewport);leftRenderer->SetBackground(1.0, 1.0, 1.0);leftRenderer->ResetCamera();vtkSmartPointer<vtkRenderer> rightRenderer = vtkSmartPointer<vtkRenderer>::New();rightRenderer->AddActor(erodedActor);rightRenderer->SetViewport(rightViewport);rightRenderer->SetBackground(1.0, 1.0, 1.0);rightRenderer->ResetCamera();vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(leftRenderer);rw->AddRenderer(rightRenderer);rw->SetSize(640, 320);rw->SetWindowName("ButterworthLowPassExample");vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Start();return 0;}

运行结果如下:

vtkImageButterworthLowPass与理想低通滤波器的使用一样。为了便于比较,这里设置X和Y方向的截止频率时,与理想低通滤波器设置一致,从结果来看,tmdyg低通滤波器产生的图像更为平滑,不会出现振铃现象。

 

参考资料:

1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, wndyc. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

所用软件:vtk7.0+visual studio 2013


注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:

https://blog.csdn.net/www_doling_net/article/details/8541534

https://blog.csdn.net/shenziheng1/article/category/6114053/4

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。