我的HPF有问题。在dft上实施HPF后,生成的图像非常奇怪。
这里有一个例子(我是新的,所以我不能发布图片,但如果没有它我就无法表达这个问题):
http://imageshack.com/a/img69/5911/tnj6.png
http://imageshack.com/a/img132/6931/fc8k.png应用半径为50的HPF
我不明白为什么会出现这种情况。当我在HPF掩模的中心添加白点时,结果是好的。低通滤波器也能很好地工作。
我想我可以消除我的FFT实现错误的可能性,因为我自己编写了一个并且我也使用了这个实现:librow.com/articles/article-10并且结果几乎相同。
这是我的HPF代码:
void Picture::HighPass(int radius){
const complex<double> oblivion=(0,0);
const int middlex = w/2;
const int middley=h/2;
double distance=0;
int * T = new int[w*h];
//draw circle in the center
for(int y=0; y<h; y++){
for(int x=0; x<w; x++){
distance = sqrt(pow((middlex-x),2) + pow((middley-y),2));
if(distance<radius){
T[x+y*w]=0;
} else T[x+y*w]=1;
}
}
//T[middlex+middley*w]=1;
int *temp = new int[w*h];
for(int i=0;i<w*h;i++)temp[i]=T[i];
//swap quadrants
for(int x=0;x<middlex;x++){
for(int y=0;y<middley;y++){
T[x+y*w] = temp[(middlex+x)+(middley+y)*w];
T[(middlex+x)+(middley+y)*w] = temp[x+y*w];
T[(middlex+x)+y*w] = temp[x+((middley+y)*w)];
T[x+((middley+y)*w)] = temp[(middlex+x)+y*w];
}
}
for(int i=0;i<w*h;i++)
if(T[i]==0) dft[i]=oblivion;
delete [] T;
delete[] temp;
}
如果你能给我一些建议或解决方案,我将非常感激。
答案 0 :(得分:0)
首先,滤镜内核中心的点有效地代表了图像的平均亮度/强度/偏移/偏差。这是过滤器的关键部分。如果将图像从空间域转换为频域,并且混乱使用中心像素,则会更改图像的平均亮度。
其次,看起来你正在实现一个砖墙式过滤器,只需在你的内核中生成一个黑色圆形。如果您将其视为3D图像,它看起来像一个实心圆柱体。要修复振铃伪像(即:任何时候使用砖墙滤波器,您将遇到振铃/混叠伪像),使用高斯类型的滤波器。如果将其可视化为3D图像,它看起来像是高斯分布的山型形状。请参阅参考资料。
因此,简而言之,不是生成砖墙滤波器,而是使用高斯滤波器。有关完整描述的图形示例,请参阅参考文献[3]中的“低通滤波:模糊”一节。
<强>参考强>
<http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm>
<https://www.cs.auckland.ac.nz/courses/compsci373s1c/PatricesLectures/Gaussian%20Filtering_1up.pdf>
<http://www.fmwconcepts.com/misc_tests/FFT_tests/>