图像频率的概念
图像的频率指的是空间频率,它和我们认知的物理频率是不同的,因此,要理解图像频率,就要将两者的定义脱离开。
图像可以看成是一个定义在二维平面上的信号,该信号的幅值对应像素的灰度(彩色图像对应 RGB 三个分量)。
如果仅仅考虑一帧图像的某一行像素,那么,可以看成是一维空间的信号。这种信号和我们常见的时域信号是很相似的,只不过时域信号是定义在时间域上的,而图像信号是定义在空间域的。
因此,图像的频率被称为空间频率,空间频率是指单位长度内亮度做周期性变化的次数,它反映了图像的像素灰度在空间中的变化情况,从傅里叶频谱上可以看到明暗不一的亮点,反映的就是某点与邻域间的差异程度。
举个例子,一帧图像的背景或者变化缓慢的区域,也就是灰度值分布比较平坦,那么,低频分量就比较强。图像的边缘、细节以及噪声的像素灰度在空间的变化非常剧烈。因此为高频分量。
根据傅里叶变换理论,频域中的频谱值都是由整幅图像计算出来的,因此,整个频谱范围内,低频分量集中在四个角,且其它地方的值只可能比这个值小。
图像变换
原图像:
clc;
clear;
I=imread('1.jpg'); % 读取图像
I=rgb2gray(I); % RGB图像转换为灰度图 - (可试试去掉然后做对比)
I=im2double(I); % 图像转换为double,此时图像的数值范围由原来的【0,255】转化为【0,1】 -(可试试去掉然后做对比)
F=fft2(I); % 进行傅里叶变换
F=fftshift(F); % 傅里叶变换后的图像进行象限转换
F=abs(F); % 求傅里叶变换的模。变换后的结果是一个复数,有实部和虚部,abs求其模。 - 并且如果没这一句的会有警告!
T=log(F+1); % 上一步得到了傅里叶变换的模,但是这个值一般是非常大的,为了更好的观察图像我们对其进行缩放。
figure; % 创建图像
imshow(T,[]); % imshow显示的只有0~1的值。尽管我们进行了缩放,凡是还是部分值大于1,后面加了[]是为了大于1的值相应的映射到0~1这个区间里!
FT后的图像
FT变换的更进一步探讨
clc;
clear;
I=imread('1.jpg'); % 读取图像
figure; % 创建一个图像句柄
subplot(2,2,1); % 对应显示的子图位置
imshow(I); % 原图显示
title('原图');
I=rgb2gray(I); % RGB图像转换为灰度图 - (可试试去掉然后做对比)
subplot(2,2,2) % 对应显示的子图位置
imhist(I); % 显示图像灰度直方图
title('灰度直方图');
%I=im2double(I); % 图像转换为double,此时图像的数值范围由原来的【0,255】转化为【0,1】 所以可以理解为二值化-(可试试去掉然后做对比)
F=fft2(I); % 进行傅里叶变换
IF = F; % 句柄备份为了傅里叶逆变换
F=fftshift(F); % 傅里叶变换后的图像进行象限转换
F=abs(F); % 求傅里叶变换的模。变换后的结果是一个复数,有实部和虚部,abs求其模。 - 并且如果没这一句的会有警告!
T=log(F+1); % 上一步得到了傅里叶变换的模,但是这个值一般是非常大的,为了更好的观察图像我们对其进行缩放。
subplot(2,2,3) % 对应显示的子图位置
imshow(T,[]); % imshow显示的只有0~1的值。尽管我们进行了缩放,凡是还是部分值大于1,后面加了[]是为了大于1的值相应的映射到0~1这个区间里!
title('傅里叶变换后的频谱图');
R=uint8(real(ifft2(IF)));% 进行IFFT变换使图像复原
subplot(2,2,4) % 对应显示的子图位置
imshow(R,[]); % 显示傅里叶逆变换后的图像
title('傅里叶逆变换后的复原图像');
suptitle('FT相关变换图像');
把程序I=im2double(I);
取消屏蔽后,再来看下对应的图像。
也就不难理解这个imdouble
,其实就是个二值化函数,把图像进行二值化!
关于几个重要函数这里也再说明下:
FFT函数:FFT(Fast Fourier Transformation)为一阶快速傅里叶变换函数,高速傅里叶变换(FFT)的实质是“分而治之”,利用对称性、周期性和可约性将某些项合并,将DFT序列分解为短序列,降低运算次数,提高运算速度。
IFFT函数:为傅里叶的逆变换,IFFT算法(x)为FFT算法相同(X),除了改变符号,N =长度比例因子(X)。由于FFT、IFFT执行时间取决于变换长度。这是最快的两个权力。这是几乎一样快,只有小素数的长度。它通常是几倍的速度的长度是总理或具有大素数因子。
关于编程中需要注意的细节:
1、imshow(T,[]);
figure;imshow(T,[]);
,具体对应到程序中就是ff2
或iff2
后的图像显示方法了。之所以用imshow(T,[]);
而不是imshow(T)
。是因为即使经过对数变换后T的取值范围仍然大于[0,1]
,比如,maxT=12.23,minT=0.009。
imshow(T)
只会显示[0,1]
的值,而imshow(T,[])
会根据灰度图的数值范围来显示图像,相当于将[0.09,12.23]
映射到[0,1]
显示。
2、经过ff2
后的句柄,到imshow
显示还得进行中间处理。
总结为:
F = fft2(I);
log(abs(ff2shift(F))+1);
imshow(T, []);
然后就到了感悟环节了
关于傅里叶变换的应用愚钝的我也仅仅知道这不过是冰山一角罢了,这个图像的变换然后再还原什么应用呢?明显,在图像的压缩大有用武之地!
图像显然缩小了,不是吗?