如果對直方圖進行頻域濾波會怎樣
原直方圖:
進行一維離散餘弦變換,公式如下:
參考代碼如下:
private int[] fourier() { int[] ft = new int[256]; int N = 256; double Cu = 1; for(int u = 0; u < N; u++){ if(u == 0){ Cu = 1.0/Math.Sqrt(2); } double sum = 0; for(int x = 0; x < N;x++){ sum += grays[x]*Math.Cos((2*x + 1) * u *Math.PI/(2*N)); } double temp = Cu * Math.Sqrt(2.0 / N) * sum; ft[u] = (int)temp; } return ft; }
反變換的公式如下:
參考代碼如下:
private int[] invertFourier() { int[] inverseft = new int[256]; int N = 256; for (int x = 0; x < N; x++) { double sum = 0; sum =(1/ Math.Sqrt(2.0)) * ditong[0]; for (int u = 1; u < N; u++) { sum += ditong[u] * Math.Cos((2 * x + 1) * u * Math.PI / (2 * N)); } double temp = Math.Sqrt(2.0 / N) * sum; inverseft[x] = Math.Abs((int)temp); } return inverseft; }
兩式中,係數C(u)的取值按照如下規則:
其中,u是頻域變量,x是灰度值,f(x)是對應灰度值的統計量。
將直方圖進行DCT變換後,得到頻譜圖像如圖:
按照當初的設想,濾去頻率高的部分,可以使波形平滑。
低通
假設使用理想低通濾波器,即,設定一個閾值D0,高於D0的部分的頻率被抑制,低於D0的部分可以通過。
假設D0爲直流分量的0.618倍(DCT實際上是離散COS變換它無非是有cos(nw)加權構成的,當n=0那就是直流分量當 n>0則是交流分量),則頻域濾波及進行反DCT變換後的的效果爲:
如果將D0設爲直流分量的0.5倍,則效果爲:
將D0設爲直流分量的0.2倍,則效果爲:
將D0設爲直流分量的0.1倍,則效果爲:
高通-按照個數取捨頻率時
如果對直方圖曲線進行高通,那麼會有如下效果:
情況1:只保留直流分量時:
情況2:保留直流分量,和前10個交流分量時:
對比原直方圖,可以看到已經出現了大致的輪廓:
情況3:保留直流分量及前20個交流分量時:
此時,形態就更接近原直方圖了:
情況4:保留直流分量及前30個交流分量時:
情況5:保留直流分量及前50個交流分量時
高通-按照頻率大小進行取捨
D0=0.9*直流分量時:
D0=0.8*直流分量時:
D0=0.5*直流分量時:
D0=0.4*直流分量時:
D0=0.3*直流分量時:
D0=0.2*直流分量時:
D0=0.1*直流分量時:
D0=0.05*直流分量時:
http://www.cnblogs.com/elaron/archive/2012/06/11/2544639.html