5.14 图像频域处理

在图像处理和分析中,经常会将图像从图像空间转换到其他空间中,并利用这些空间的特点进行对转换后图像进行分析处理,然后再将处理后的图像转换到图像空间中,这称之为图像变换。在一些图像处理和分析中通过空间变换往往会取得更有效的结果。图像频域处理是指将图像从图像空间转换到频域空间进行处理的过程。最常用的频域转换是傅里叶变换。对于傅里叶变换的理论内容不是这里讨论的重点,读者可以从网上找到大量的资料。傅里叶变换的计算量较大,人们为了提高速度,提出了快速傅里叶变换,并得到了广泛的应用。下面我们首先来学习一下VTK中的快速傅里叶变换。

5.14.1 快速傅里叶变换

快速傅里叶变换(Fast Fourier Transform),简称做FFT。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。傅里叶变换是可逆的,其逆变换为RFFT。FFT在数字图像处理中有着广泛的应用,例如数字图像频域滤波,去噪,增强等等。 目前VTK中两变换都已经实现,对应的类分别为vtkImageFFT和vtkImageRFFT。下面代码演示了怎样对图像进行傅里叶变换,以及将傅里叶变换结果进行逆变换。

vtkImageFFT和vtkImageRFFT的输入为实数或者复数数据,输出都为复数数据。因此,vtkImageFFT与vtkImageRFFT的输出结果不能直接显示,因为VTK会将其当做彩色图像显示,需要通过vtkImageExtractComponents提取某一组分图像显示。

VTK频率域的图像处理步骤如下:

图5.35VTK频率域的图像处理步骤

下面代码说明了怎样对一副图像进行快速傅里叶变换和逆变换。

1:      vtkSmartPointer<vtkJPEGReader>reader =

2:         vtkSmartPointer<vtkJPEGReader>::New();

3:     reader->SetFileName ( " lena2.jpg" );

4:     reader->Update();

5:

6:     vtkSmartPointer<vtkImageFFT> fftFilter =

7:         vtkSmartPointer<vtkImageFFT>::New();

8:     fftFilter->SetInputConnection(reader->GetOutputPort());

9:     fftFilter->Update();

10:

11:     vtkSmartPointer<vtkImageExtractComponents> fftExtractReal =

12:         vtkSmartPointer<vtkImageExtractComponents>::New();

13:     fftExtractReal->SetInputConnection(fftFilter->GetOutputPort());

14:     fftExtractReal->SetComponents(0);

15:

16:     vtkSmartPointer<vtkImageCast> fftCastFilter =

17:         vtkSmartPointer<vtkImageCast>::New();

18:     fftCastFilter->SetInputConnection(fftExtractReal->GetOutputPort());

19:     fftCastFilter->SetOutputScalarTypeToUnsignedChar();

20:     fftCastFilter->Update();

21:

22:     vtkSmartPointer<vtkImageRFFT> rfftFilter =

23:         vtkSmartPointer<vtkImageRFFT>::New();

24:     rfftFilter->SetInputConnection(fftFilter->GetOutputPort());

25:     rfftFilter->Update();

26:

27:     vtkSmartPointer<vtkImageExtractComponents> ifftExtractReal =

28:         vtkSmartPointer<vtkImageExtractComponents>::New();

29:     ifftExtractReal->SetInputConnection(rfftFilter->GetOutputPort());

30:     ifftExtractReal->SetComponents(0);

31:

32:     vtkSmartPointer<vtkImageCast> rfftCastFilter =

33:         vtkSmartPointer<vtkImageCast>::New();

34:     rfftCastFilter->SetInputConnection(ifftExtractReal->GetOutputPort());

35:     rfftCastFilter->SetOutputScalarTypeToUnsignedChar();

36:     rfftCastFilter->Update();

首先建立一个JPEG图像reader来读取一副灰度图像。然后定义一个vtkImageFFT指针,直接接收reader的输出即原图像数据作为输入进行二维快速傅里叶变换。其输出为一个像素类型为复数的vtkImageData数据,即每个像素值为两个组分(Component):复数实部和虚部。因此如果直接显示这个vtkImageData,会发现是一个彩色图像。如果需要显示频域图像,需要通过vtkImageExtractComponents类来提取某一个组分图像来显示。上例中通过定义vtkImageExtractComponents类指针,利用函数SetComponents(0)指定提取实部图像显示;由于vtkImageActor类仅支持unsigned char数据类型的图像,利用vtkImageCast类的SetOutputScalarTypeToUnsignedChar()指定输出类型为unsigned char,将FFT结果图像转换为需要的类型。

对于逆变换的过程也是类似。首先定义vtkImageRFFT指针,并接收输入为vtkImageFFT指针的输出,调用Update执行函数完成快速傅里叶逆变换。vtkImageRFFT的输出同样为一副复数图像,通常不能直接显示或者进行其他操作。对于傅里叶逆变换的图像中虚数部分值为0,实数部分图像即为重建的原始图像。因此再次利用vtkImageExtractComponents提取实数部分图像,并通过vtkImageCast的SetOutputScalarTypeToUnsignedChar()将图像转换为unsigned char类型进行显示。下图为计算结果。

图5.36 快速傅立叶变换

图像通过FFT变换到频域后,可以通过改变不同的频率分量来对图像进行处理。图像频域处理的步骤是,先将空域图像通过FFT变换到频域图像,设计一个滤波器对不同频率的频域分量进行处理,将处理后的频域图像通过IFFT变换回空域中得到处理后的图像。滤波器的设计需要根据具体需求来变化,主要分为两种,低通滤波器和高通滤波器。下面我们来分别介绍。

5.14.2 低通滤波

5.14.2.1 理想低通滤波器

低通滤波是将频域图像中的高频部分滤除而通过低频部分。图像的边缘和噪声对应于频域图像中的高频部分,而低通滤波的作用即是减弱这部分的能量,从而达到图像平滑去噪的目的。最简单的低通滤波器是理想低通滤波器,基本思想是给定一个频率阈值,将高于该阈值的所有部分设置为0,而低于该频率的部分保持不变。理想是指该滤波器不能用电子元器件来实现,但是可以通过计算机来模拟。在VTK中定义了理想低通滤波器,下面我们来看下怎么使用该滤波器来对图像进行低通滤波。

1:      vtkSmartPointer<vtkJPEGReader>reader =

2:         vtkSmartPointer<vtkJPEGReader>::New();

3:     reader->SetFileName("lena2.jpg");

4:     reader->Update();

5:

6:     vtkSmartPointer<vtkImageFFT> fftFilter =

7:         vtkSmartPointer<vtkImageFFT>::New();

8:     fftFilter->SetInputConnection(reader->GetOutputPort());

9:     fftFilter->Update();

10:

11:     vtkSmartPointer<vtkImageIdealLowPass> lowPassFilter =

12:         vtkSmartPointer<vtkImageIdealLowPass>::New();

13:     lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());

14:     lowPassFilter->SetXCutOff(0.05);

15:     lowPassFilter->SetYCutOff(0.05);

16:     lowPassFilter->Update();

17:

18:     vtkSmartPointer<vtkImageRFFT> rfftFilter =

19:         vtkSmartPointer<vtkImageRFFT>::New();

20:     rfftFilter->SetInputConnection(lowPassFilter->GetOutputPort());

21:     rfftFilter->Update();

22:

23:     vtkSmartPointer<vtkImageExtractComponents> ifftExtractReal =

24:         vtkSmartPointer<vtkImageExtractComponents>::New();

25:     ifftExtractReal->SetInputConnection(rfftFilter->GetOutputPort());

26:     ifftExtractReal->SetComponents(0);

27:

28:     vtkSmartPointer<vtkImageCast> castFilter =

29:         vtkSmartPointer<vtkImageCast>::New();

30:     castFilter->SetInputConnection(ifftExtractReal->GetOutputPort());

31:     castFilter->SetOutputScalarTypeToUnsignedChar();

32:     castFilter->Update();

首先读入一副jpg图像,通过vtkImageFFT将图像转换到频域空间。vtkImageIdealLowPass对频域图像做理想低通滤波,需要用户设置每个方向的截断频率,相应的设置函数SetXCutOff()和SetYCutOff()。执行完毕后,需要通过vtkImageRFFT将处理后的频域图像转换至空域图像。需要注意的是,转换后的图像每个像素都是一个复数,需要vtkImageExtractComponents将该图像的第一个分量提出出来显示,否则图像不能正确显示。由于傅里叶变换输入输出的数据类型都是double,为了方便显示,还需要将其转换为Unsigned char类型,这里vtkImageCast负责类型转换。下面是对图像做低通滤波的效果。从结果看,在过滤掉图像的高频部分后,图像变得模糊,丢失了许多细节,另外还可以看到图像会存在一定的振铃效应,这也是理想低通滤波的特点。

图5.37 理想低通滤波器

5.14.2.2 巴特沃斯低通滤波器

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

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

1:     vtkSmartPointer<vtkImageButterworthLowPass> lowPassFilter =

2:         vtkSmartPointer<vtkImageButterworthLowPass>::New();

3:     lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());

4:     lowPassFilter->SetXCutOff(0.05);

5:     lowPassFilter->SetYCutOff(0.05);

6:     lowPassFilter->Update();

vtkImageButterworthLowPass与理想低通滤波器的使用一样,因此这里只复制了部分代码。为了便于比较,这里设置X和Y方向的截止频率时,与理想低通滤波器设置一致,下面是相应的执行结果。从结果来看,巴特沃斯低通滤波器产生的图像更为平滑,不会出现振铃现象。

图5.38 巴特沃斯滤波器

5.14.3 高通滤波

5.14.3.1 理想高通滤波器

高通滤波与低通滤波正好相反,是频域图像的高频部分通过而抑制低频部分。在图像中图像的边缘对应高频分量,因此高通滤波的效果是图像锐化。同样最简单的高通滤波器是理想高通滤波器。通过设置一个频率阈值,将高于该阈值的频率部分通过,而低于阈值的低频部分设置为0。下面来看一下VTK中理想高通滤波的实例。

1:      vtkSmartPointer<vtkJPEGReader>reader =

2:         vtkSmartPointer<vtkJPEGReader>::New();

3:     reader->SetFileName("lena2.jpg");

4:     reader->Update();

5:

6:     vtkSmartPointer<vtkImageFFT> fftFilter =

7:         vtkSmartPointer<vtkImageFFT>::New();

8:     fftFilter->SetInputConnection(reader->GetOutputPort());

9:      fftFilter->Update();

10:

11:     vtkSmartPointer<vtkImageIdealHighPass> highPassFilter =

12:         vtkSmartPointer<vtkImageIdealHighPass>::New();

13:     highPassFilter->SetInputConnection(fftFilter->GetOutputPort());

14:     highPassFilter->SetXCutOff(0.1);

15:     highPassFilter->SetYCutOff(0.1);

16:     highPassFilter->Update();

17:

18:     vtkSmartPointer<vtkImageRFFT> rfftFilter =

19:         vtkSmartPointer<vtkImageRFFT>::New();

20:     rfftFilter->SetInputConnection(highPassFilter->GetOutputPort());

21:     rfftFilter->Update();

22:

23:     vtkSmartPointer<vtkImageExtractComponents> ifftExtractReal =

24:         vtkSmartPointer<vtkImageExtractComponents>::New();

25:     ifftExtractReal->SetInputConnection(rfftFilter->GetOutputPort());

26:     ifftExtractReal->SetComponents(0);

27:

28:     vtkSmartPointer<vtkImageCast> castFilter =

29:         vtkSmartPointer<vtkImageCast>::New();

30:     castFilter->SetInputConnection(ifftExtractReal->GetOutputPort());

31:     castFilter->SetOutputScalarTypeToUnsignedChar();

32:     castFilter->Update();

同低通滤波一样,首先将读入图像通过vtkImageFFT转换到频域空间,定义vtkImageIdealHighPass对象,并通过SetXCutOff ()和SetYCutOff() 设置X和Y方向的截止频率。然后通过vtkImageRFFT将处理后的图像转换到空域中,得到高通滤波图像。为了显示的需要,还需要提取图像分量和数据类型的转换,这里与低通滤波一致,不再赘述。下面是理想高通滤波的执行结果。从结果看出高通滤波后图像得到锐化处理,图像中仅剩下边缘。

图5.39 理想高通滤波器

5.14.3.2 巴特沃斯高通滤波器

理想高通滤波器不能通过电子元器件来实现,而且存在振铃现象。在实际中最常使用的高通滤波器是巴特沃斯高通滤波器。该滤波器的转移函数是:

D(u,v)表示频域中点到频域平面的距离,是截止频率。当D(u,v)大于时,对应的H(u,v)逐渐接近1,从而使得高频部分得以通过;而当D(u,v)小于时,H(u,v)逐渐接近0,实现低频部分过滤。巴特沃斯高通滤波器在VTK中对应vtkImageButterworthHighPass类。下面代码说明了vtkImageButterworthHighPass对图像进行高通滤波。

1:     vtkSmartPointer<vtkImageButterworthLowPass> lowPassFilter =

2:         vtkSmartPointer<vtkImageButterworthLowPass>::New();

3:     lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());

4:     lowPassFilter->SetXCutOff(0.05);

5:     lowPassFilter->SetYCutOff(0.05);

6:     lowPassFilter->Update();

vtkImageButterworthHighPass与理想高通滤波使用方法一致,这里没有给出傅里叶变换和逆变换代码。这里也需要设置X和Y轴的截止频率,为了便于比较,其截止频域与理想高通滤波设置一致。下图是执行结果。

图5.40 巴特沃斯高通滤波器

==========欢迎转载,转载时请保留该声明信息==========

版权归@东灵工作室所有,更多信息请访问东灵工作室

教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

================================================

5.14 图像频域处理相关推荐

  1. 【OpenCV 例程200篇】14. 图像与标量相加(cv2.add)

    [OpenCV 例程200篇]14. 图像与标量相加(cv2.add) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  2. C语言数字图像处理---2.5图像频域滤波

    上一小节我们介绍了图像频域变换,本小节将以此为基础,介绍图像频域滤波的相关内容,包含常见高通/低通/带通/带阻/方向滤波等频域滤波方法,同时以C语言编码实现,帮助初学者理解和掌握如何进行图像的频域滤波 ...

  3. java 图像傅里叶变换_图像频域滤波与傅里叶变换

    1.频率滤波 图像的空间域滤波:用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单.图像处理不仅可以在空间域进行还可以在频率域进行,把空间域的图像开窗卷积形式,变 ...

  4. 10句话读懂图像频域滤波——不能不知道的信号与系统基本理论

    10句话读懂图像频域滤波--不能不知道的信号与系统基本理论 今天的图像处理依靠各类方便易用的工具箱与函数库似乎已然成为上手就能用的应用科学.但没有那种算法是普适的,知其所以然才能真正理解原理,深刻的理 ...

  5. 【个人笔记】14 图像几何形状绘制

    个人资料,仅供学习使用 学习课程:OpenCV4 C++ 快速入门视频30讲--贾志刚 14 图像几何形状绘制 opencv知识点: 四种几何图形绘制 - 矩形 圆形 线段 椭圆 图片融合 - add ...

  6. Python图像处理八:图像频域滤波

    一.图像频谱 在 numpy 库的 fft 模块中有计算二维离散傅里叶变换的函数 fft2,此外图像 变换到频域后,原点需要移动到频域矩形的中心,所以要对fft2的结果使用fftshift 函数实现频 ...

  7. 数字图像处理——图像频域增强

    图像几何变换 图像频域增强 图像变换的目的 傅里叶变换 空间频率的理解 如何看频谱图 从频域变回空间域 图像频域增强 图像变换是图像频域增强技术的基础,也是变换域分析理论的基础,图像频域增强基于图像信 ...

  8. 第四章 图像频域滤波

    本章主要内容为二维傅立叶变换及其反变换,频域平滑滤波器.频域锐化滤波器,以及同态滤波器的相关介绍. 本章要求重点掌握图像频域滤波的基本流程及表示:二维离散傅里叶变换的表示及特点:频域平滑滤波器的基本原 ...

  9. python图像处理基础 || (五) 图像频域的阈值型高通与低通滤波

    图像频域的阈值型高通与低通滤波 文章目录 图像频域的阈值型高通与低通滤波 1. 频域图像非卷积操作的高通滤波 2. 频域图像非卷积操作的低通滤波 3. 频域图像的带通滤波 本部分内容所用的数据放在百度 ...

最新文章

  1. 了解这些,你就可以在Spring启动时为所欲为了
  2. key php 转小写_PHP代码层防护与绕过
  3. RF内置库函数学习(一)
  4. 301转向和网址规范化
  5. Linux常用的挂载远程目录方案使用有感
  6. UVA10284 POJ2512 Chessboard in FEN【国际象棋】
  7. 江苏图采上传自定义证件照
  8. 3DMax基础入门教程,命令面板的设置简介以及功能
  9. Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)
  10. qpython 3h下载_【分享】QPython 3H3.0.0 一个伟大的脚本编辑器!
  11. 第120章 SQL函数 ROUND
  12. python爬取快代理和西刺的国内高匿代理IP
  13. 高频PCB设计设计技巧简述
  14. [论文笔记|VIO]On the Comparison of Gauge Freedom Handling in Optimization-based V-I State Estimation
  15. 图片阴影效果和影子效果
  16. Langevin dynamic 和 Hamiltonian Monte Carlo
  17. jdbc连接mysql的serverTimeZone参数配置
  18. Java、JSP等足球俱乐部网站
  19. 网心科技获得深圳市“专精特新”中小企业认定
  20. Creo二次开发:创建工程图,生成球标和明细表

热门文章

  1. 东京奥运会的官网的最上面是广告栏
  2. formal method lecture 2: propositional logic
  3. 《守望先锋》阵亡镜头、全场最佳和亮眼表现是如何设计
  4. C# unsafe模式内存操作深入探索
  5. Linux+DDoS deflate 预防DDoS
  6. 高效多云管理做到这点就够!
  7. ROS学习之roslaunch的node标签
  8. javascript继承一览
  9. MacBook Pro新版上市
  10. hdu 5606(并查集)