1.理想低通滤波器
低通滤波是将频域图像中的高频部分滤除而保留低频部分。图像的边缘和噪声对应于频域图像中的高频部分,而低通滤波的作用即是减弱这部分的能量,从而达到图像平滑去噪的目的。最简单的低通滤波器是理想低通滤波器,其基本思想是给定一个频率阈值,将高于该阈值的所有部分设置为0,而低于该频率的部分保持不变。这里的“理想”是指该滤波器不能用电子元器件来实现,但是可以通过计算机来模拟。VTK 中定义了理想低通滤波器vtkImageIdealLowPass,下述代码演示了使用该滤波器对图像进行低通滤波的方法(详见随书代码Examples\Chap05\5.6_ IdealLowPassExample.cpp):
- vtkSmartPointer<vtkJPEGReader> reader =
- vtkSmartPointer<vtkJPEGReader>::New();
- reader->SetFileName(argv[1]);
- 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);
- 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();
首先通过vtkImageFFT 将图像转换到频域空间。vtkImageIdealLowPass 对频域图像做理想低通滤波,需要用户设置每个方向的截断频率,相应的设置函数为SetXCutOff()和SetYCutOff()。执行完毕,需要通过vtkImageRFFT 将处理后的频域图像转换成空域图像。需要注意的是,转换后图像的每个像素都是一个复数,需要用vtkImageExtractComponents 将该图像的第一个分量提取出来显示,否则图像不能正确显示。由于傅里叶变换输入和输出的数据类型都是double,为了方便显示,还需将其转换为unsigned char 类型(这里由vtkImageCast 类负责类型转换)。图5-40 为理想低通滤波的效果。从结果看,在过滤掉图像的高频部分后,图像变得模糊,丢失了许多细节,另外还可以看到理想低通滤波后图像会存在一定的振铃效应,这也是理想低通滤波的特点。
2.巴特沃斯低通滤波器
在实际应用中,经常使用的低通滤波器是巴特沃斯滤波器。巴特沃斯滤波器对应的转移函数(可以看作一个系数矩阵)是
其中,D(u,v)表示频域点(u,v)到频域图像原点的距离,D0 为截止频率,当D(u,v) = D0 时,H(u,v)=0.5,即对应的频域能量将为原来的一半。因为巴特沃斯低通滤波器在高低频间的过渡平滑,因此不会出现明显的振铃效应。VTK 中实现巴特沃斯低通滤波器的类是vtkImageButterworthLowPass,代码如下:
- vtkSmartPointer<vtkImageButterworthLowPass> lowPassFilter =
- vtkSmartPointer<vtkImageButterworthLowPass>::New();
- lowPassFilter->SetInputConnection(fftFilter->GetOutputPort());
- lowPassFilter->SetXCutOff(0.05);
- lowPassFilter->SetYCutOff(0.05);
- lowPassFilter->Update();
vtkImageButterworthLowPass 的使用方法与理想低通滤波器一样,为了便于比较,在设置X 和Y 方向的截止频率时,应与理想低通滤波器的设置保持一致。图5-41 是相应的运行结果。从结果来看,巴特沃斯低通滤波器产生的图像更为平滑,不会出现振铃现象。