如果对直方图进行频域滤波会怎样
原直方图:
进行一维离散余弦变换,公式如下:
参考代码如下:
View Code
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; }
反变换的公式如下:
参考代码如下:
View Code
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变换后的的效果为:
如果将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*直流分量时: