我有使用FFT来扩展图像功率谱的问题。代码在
之下void spectrumFFT(Complex<double> *f, Complex<double> *output, int width, int height){
Complex<double> *temp = new Complex<double>[width * height];
Complex<double> *singleValue = new Complex<double>();
for(int j = 0; j < height; j++){
for(int i = 0; i < width; i++){
singleValue = f[i + j * width];
Complex<double> tempSwap = singleValue->Mag();
// tempSwap assign Magnitude value from singleValue
temp[i + j * width] = tempSwap;
}
}
假设临时1-D数组是幅度值的填充。我的问题是如何扩展范围在[0 - 255)之间的最小和最大值。
注意:输入* f已经是2DFFT的计算值,*输出值将填充最小值和最大值。
编程有什么想法吗?
谢谢,
此致 一郎
答案 0 :(得分:2)
你的问题不是100%明确,所以我可能会关闭,这可能不是你想要的 - 我会做一般的,忽略你实际可能获得或使用的价值范围。
假设您已获得绝对最小值和绝对最大值vmin
和vmax
,并且您希望将整个范围缩放为[0;你可以这样做:
// move the lower end to 0
double mod_add = -vmin;
double mod_mul = 255 / (vmax + mod_add);
现在,将一个值重新排列到我们计算的范围:
double scaled = (value + mod_add) * mod_mul;
mod_add
会将负数/值移到正范围(绝对最小值将变为0),mod_mul
将缩放整个范围(从绝对最小值到绝对最大值)以适合[ 0; 255]。如果没有负值,您可以明显跳过mod_add
。如果您希望将0保持在中心(即127),则必须跳过mod_add
,而是使用绝对最大值vmax
和vmin
并将其缩放为127而不是255。
另一方面,我认为你可以大大简化你的循环,可能节省一些处理时间(可能无法取决于那里的其他代码):
const unsigned int num = width * height;
for (unsigned int i = 0; i < num; i++)
temp[i] = f[i]->Mag();
另外,正如Oli在评论中所提到的,你不应该在开头为singleValue
分配任何值,因为它总是在以后被覆盖。