1.低通滤波器
低通滤波是将频域图像中的高频部分滤除而通过低频部分。图像的边缘和噪声对应于频域图像中的高频部分,而低通滤波的作用即是减弱这部分的能量,从而达到图像平滑去噪的目的。

2.理想低通滤波器
最简单的低通滤波器是理想低通滤波器,基本思想是给定一个频率阈值,将高于该阈值的所有部分设置为0,而低于该频率的部分保持不变。

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

在VTK中定义了理想低通滤波器,下面我们来看下怎么使用该滤波器来对图像进行低通滤波:

//理想低通滤波器
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkImageFFT.h>
#include <vtkImageIdealLowPass.h>
#include <vtkImageData.h>
#include <vtkImageRFFT.h>
#include <vtkImageCast.h>
#include <vtkImageExtractComponents.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>int main()
{vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("data\\lena.jpg");reader->Update();vtkSmartPointer<vtkImageFFT> fftFilter = vtkSmartPointer<vtkImageFFT>::New();fftFilter->SetInputConnection(reader->GetOutputPort());fftFilter->Update();vtkSmartPointer<vtkImageIdealLowPass> lowPassFilter = vtkSmartPointer<vtkImageIdealLowPass>::New();lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());lowPassFilter->SetXCutOff(0.05); //设置x\y方向上的截断频率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();//数据类型转换为unsigned char类型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->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.巴特沃兹低通滤波器

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

其中D(u,v)表示频域点(u,v)到频域图像原点的距离,称为截止频率,当D(u,v) = 时,H(u,v)=0.5,即对应的频域能量将为原来的一半。因为巴特沃斯低通滤波器在高低频间的过渡平滑,因此不会出现明显的振铃效应。VTK中实现巴特沃斯低通滤波器的类是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方向的截止频率时,与理想低通滤波器设置一致,从结果来看,巴特沃斯低通滤波器产生的图像更为平滑,不会出现振铃现象。

参考资料:

1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, 罗火灵. 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

5.6.2 低通滤波器(理想低通+巴特沃斯低通滤波器)相关推荐

  1. 一个设计低通巴特沃斯数字滤波器的实例

    本人本科渣渣一个,前两天导师让我设计一个数字滤波器.由于本人基本没有数字信号处理基础,于是只能依靠百度和matlab,折腾了半天总算是摸索明白了.百度上有一些文章不靠谱,很容易误导别人,故在此发一篇博 ...

  2. Matlab语音信号去噪程序,使用低通巴特沃斯滤波器

    Matlab语音信号去噪程序,使用低通巴特沃斯滤波器. 1.读取一段歌曲的信号,绘制时域频域图,并播放. 2.添加正弦噪声: 3.设计巴特沃斯低通滤波器: 4.使用滤波器去除噪声,并画出时域频域图,播 ...

  3. 设计低通巴特沃斯数字滤波器(matlab)去除ECG基线漂移实例

    matlab代码************************** M=load ('datafile'); ecg=M(1:15000,1); 读取数据 fs=512; 采样率 fmaxd_1=5 ...

  4. java巴特沃斯滤波器编程_EMG信号的低通巴特沃斯滤波器

    使用matlab中自带的randn函数产生一组随机数,作为EMG信号,然后EMG信号的采样率为2048hz.这里随机数产生的随机数种子采用的机遇系统时钟的随机数种子.系统输入有两个,一个是仿真时间,单 ...

  5. 【图像去噪】均值+中值+高通低通+巴特沃斯+PCA+小波+维纳滤波图像去噪【含GUI Matlab源码 1705期】

    ⛄一.案例说明 三幅经典的图像(lena.peppers.barbara)分别加上了高斯噪声.乘性噪声.椒盐噪声.高斯白噪声:均值为0,方差为0.05.椒盐噪声:噪声密度0.10. 乘性噪声:这里为均 ...

  6. matlab 实现低通巴特沃斯滤波器、切比雪夫1型/2型滤波器 和 椭圆滤波器

    下面的函数为四种低通滤波器的实现 function [b, a]=analogfile(Wp, Ws, alphamax, alphamin, Wmax, ind)if ind==1,[N,Wn]=b ...

  7. 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器

    目录 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 高斯低通滤波器(GLPF) 巴特沃斯低通滤波器 低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心 ...

  8. python理想低通滤波、巴特沃斯低通滤波、高斯低通滤波实现

    代码 代码如下(示例): import numpy as np import cv2 as cv image = cv.imread('2.PNG') # print(image.shape) ima ...

  9. matlab常见的图像增强技术(包括基于幂次变换,对图像进行均衡化处理,巴特沃斯低通,理想低通,梯形低通滤波, 均值滤波,中值滤波,最大,最小值滤波,修正后的阿尔法滤波器)

    1.基于幂次变换中的r值,比较不同r 值下图像增强的效果 代码 : I = imread('D:\图片\TH.JFIF');subplot (1,4,1);imshow(I);title('原始图像' ...

最新文章

  1. java List集合中contains方法总是返回false
  2. PHP5 $this self parent static的区别
  3. linux命令用tar czvf .tar.gz好用的
  4. c# 任务栏托盘图标鼠标进入MouseEnter和鼠标离开MouseLeave实现
  5. Natasha V1.3.6.0 的升级日志
  6. springboot-21-maven多环境打包
  7. Flex App的Size和Link报告
  8. 1.1.3开启线程(Starting a Thread)
  9. C语言:大小字母转换(ASCII码)
  10. 关于微信小程序图标icon的五种实现方案
  11. 汽车电子测试相关名词解释
  12. html 星星字体,做华丽的星星文字效
  13. Word技巧和快捷键
  14. script脚本阻塞的探究、异步属性async和defer的区别
  15. 【NOIP模拟】慢跑问题
  16. mysql内嵌插入语句_MySQL中添加或插入语句(Insert)的几种使用方式
  17. Web前端之布局模型
  18. 15 《上帝之饮:六个瓶子里的历史》 -豆瓣评分7.5
  19. 三星s20Android11怎么退回10,三星已经开始在GALAXY S20+上测试安卓11系统
  20. 儿子满墙奖状却没考上重点高中,妈妈愤怒撕下痛哭:不读出去打工

热门文章

  1. 更换Ubuntu的更新源方式
  2. bilinear interpolation是什么
  3. java集合的接口和类层次结构图
  4. ZYNQ-7的芯片引脚
  5. 三维点云论文——图片常用格式LaTeX排版
  6. Linux运维技术之详解任务计划(crontab命令)
  7. 太太丘舍去_太丘舍去,去后乃至(离开)——青夏教育精英家教网——
  8. 以Docker方式安装和配置Kong网关和Konga控制台
  9. 科学计算机程序 字表处理软件都是,计算机应用基础知识--1
  10. spring入门例子