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: ifftExtract