5.14 图像频域处理
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 图像频域处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爆款入门 | 第 14 期微生物组-扩增
- 下一篇: Science子刊:喝酒脸红的人,患胃癌