【计算机视觉】图像增强----图像的傅立叶变换

简介: 【计算机视觉】图像增强----图像的傅立叶变换

一:相关概念

1.什么是傅里叶变换

       傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像处理技术的人来说,把时间用在学习和掌握博里叶变换上是很有必要的。

2.傅里叶变换的定义

对于二维信号,二维Fourier变换定义为:

image.gif编辑

二维离散傅立叶变换为:

image.gif编辑

图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参见参考书目,有关傅立叶变换的快速算法的程序不难找到。实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。

二:傅里叶变换

a) 绘制一个二值图像矩阵,并将其傅立叶函数可视化。

f=zeros(30,30);

f(5:24,13:17)=1;

imshow(f,'InitialMagnification','fit')

image.gif编辑

图2.5.1-1 矩阵可视化结果

F=fft2(f);

F2=log(abs(F));

figure,imshow(F2,[-1 5],'InitialMagnification','fit');colormap(jet);

image.gif编辑

图2.5.1-2 矩阵频谱图

       分析:fft2表示将二维矩阵转换为频域,可以看到得到的像谱图不是中心对称的, 因此需要进行下一步处理。可以看到,由于矩阵的零频分量分布在矩阵的四周,而1 频分量分布在中心,所以在矩阵中间的梯度较大,对应的频谱图越暗。

F=fft2(f,256,256); %零填充为256×256矩阵

figure,imshow(log(abs(F)),[-1 5],'notruesize');colormap(jet);

image.gif编辑

图2.5.1-3 256*256矩阵频谱图

F2=fftshift(F);    %将图像频谱中心由矩阵原点移至矩阵中心

figure,imshow(log(abs(F2)),[-1 5],'notruesize');colormap(jet);

image.gif编辑

图2.5.1-4 频谱中心化处理结果

       分析:根据快速傅里叶变换的计算要求,需要图像的行数、列数均满足2的n次方,所以进行转换前要进行补零操作。一个M行N列的二维图像f(x,y),先按行队列变量y做一次长度为N的一维离散傅里叶变换,再将计算结果按列向对变量x做一次长度为M傅里叶变换就可以得到该图像的傅里叶变换结果。fft2将时域信号转换为频域信号,低频分布在四周,fftshift用于将fft2的 DC分量移动到频谱中心,低频区域移动到中央,这样便于处理,可以看到得到的频谱图是中心对称的。

b)利用傅立叶变换分析两幅图像的相关性,定位图像特征。读入图像‘text.png',抽取其中的字母‘a’。

bw=imread('text.png');

a=bw(32:46,85:102);

imshow(bw);

image.gif编辑

图2.5.1-5 bw可视化结果

figure,imshow(a);

image.gif编辑

图2.5.1-6 截取’a’

C=real(ifft2(fft2(bw).*fft2(rot90(a,2),256,256)));%求相关性

figure,imshow(C,[]);

image.gif编辑

图2.5.1-7  计算相关性

thresh=max(C(:));

figure,imshow(C>thresh-10)

image.gif编辑

图2.5.1-8 相关值大于thresh-10

figure,imshow(C>thresh-15)

image.gif编辑

图2.5.1-9 相关值大于thresh-15

       在空域中f(x,y)与 与 g(x,y) 的相关等价于频域中 F(u,v) 的共轭与 G(u,v)  相乘,利用傅里叶变换,可以将积分求和过程转换成频域相乘(程序里求的是相乘后的实部),简化了计算过程,相关定理与卷积定理类似。相关定理可用于匹配当中,用于寻找感兴趣的物体,例如题中寻找字母a,匹配之后函数相关值在匹配点达到最大值(见图2.5.1-7,匹配点亮度最亮)。此外在寻找其他区域匹配点时,先找出了相关矩阵的最大值,然后显示出相关值大于最大值减10的匹配点,可以看到在第一第二行基本匹配成功(见2.5.1-8),显示出相关值大于最大值减15的匹配点时误差比较大。其实求的也即实部误差。

三:离散余弦变换(DCT)

a) 使用dct2对图像‘autumn.tif’进行DCT变换

RGB=imread('autumn.tif');

imshow(RGB)

image.gif编辑

图2.5.2-1 autumn.tif

I=rgb2gray(RGB); %转换为灰度图像

figure,imshow(I)

image.gif编辑

图2.5.2-2 autumn.tif灰度处理

J=dct2(I);

figure,imshow(log(abs(J)),[]),colormap(jet(64));colorbar;

image.gif编辑

图2.5.2-3 autumn图像dct系数

       对原始图像进行离散余弦变换,首先要把彩色图片进行灰度化处理,可以看到变换后的DCT系数能量主要集中在左上角,其余大部分DCT系数接近于0,说明离散余弦变换适用于对图像进行压缩。低频系数体现的是图像中目标的轮廓和灰度分布特性,高频系数体现的是目标形状的细节信息。DCT变换之后,能量主要集中在低频分量处,这也是DCT变换去相关性的一个体现。

b) 将上述DCT变换结果中绝对值小于10的系数舍弃,使用idct2重构图像并与原图像比较。

K=idct2(J);

figure,imshow(K,[0 255])

image.gif编辑

图2.5.2-4 DCT逆变换

J(abs(J)<10)=0;  %舍弃系数

K2=idct2(J);

figure,imshow(K2,[0 255]);

image.gif编辑

图2.5.2-5 DCT压缩处理

       DCT变换和FFT变换都属于变换压缩方法,变换压缩的一个特点是将从前密度均匀的信息分布变换为密度不同的信息分布。在图像中,低频部分的信息量要大于高频部分的信息量,尽管低频部分的数据量比高频部分的数据量要小的多。对DCT系数设置门限(将DCT系数低于10的灰度值置0),这就是图像压缩的量化过程,再经过逆变换将频域转换成空域便可达到压缩效果,可以看到,虽然图像经过了压缩处理,但是图像质量肉眼看不出变化(见图2.5.2-5)。

c) 利用DCT变换进行图像压缩。

I=imread('cameraman.tif');

I=im2double(I);

T=dctmtx(8);

% B=blkproc(I,[8,8],'P1*x*P2',T,T');

fun = @(block_struct)T*block_struct.data*T';

B=blockproc(I,[8 8],fun);

mask=[1  1  1  1  0  0  0  0

     1  1  1  0  0  0  0  0

     1  1  0  0  0  0  0  0

     1  0  0  0  0  0  0  0

     0  0  0  0  0  0  0  0

     0  0  0  0  0  0  0  0

     0  0  0  0  0  0  0  0

     0  0  0  0  0  0  0  0];

% B2=blkproc(B,[8 8],'P1.*x',mask);

fun = @(block_struct)Mask.*block_struct.data;

B2=blockproc(B,[8 8],fun);

% I2=blkproc(B2,[8 8],'P1*x*P2',T',T);

fun = @(block_struct)T'*block_struct.data*T;

I2=blockproc(B2,[8 8],fun);

imshow(I)

image.gif编辑

图2.5.2-6 cameramen.tif

figure,imshow(I2);

image.gif编辑

图2.5.2-5 图片压缩

       在运行参考代码时候,出现警告说建议使用blockproc来替换掉blkproc,经过查 阅得知两者的区别是blkproc必须一次性把要处理的矩阵全部导入内存中,对一些超大 型图像就无法使用了,随后matlab推出了可以处理任意大的图像blockproc函数。把 blkproc改成blockproc后,出现了错误,查阅帮助文档得知blockproc函数的原型为B = blockproc(A,[M N],FUN),A是要处理的图像矩阵,[M,N]是每次分块处理矩阵的大小, FUN是函数句柄,即对每块矩阵的处理函数。不同于blkproc,FUN须事先定义好,且 输入必须是结构体,其data域是我们的矩阵数据,这里由blockproc分块后的机制决定。

       fun = @(block_struct)T*block_struct.data*T'的作用为进行离散余弦变换,以便于后 面进行压缩处理,其中T表示8*8的DCT变换矩阵。由于DCT系数能量值主要分布 于左上角,因此mask将左上角的系数设置为1,其余位置设置为0,这样就能保留每 个块中的低频系数,而舍弃高频系数,以达到图像压缩的目的。最后再通过fun = @(block_struct)T'*block_struct.data*T;进行反余弦变换,将频域转换为空域,得到 压缩后的图像。

四:反变换

①对(1)中的矩阵进行反变换,代码如下:

F3 = iff2(F);

figure,imshow(log(abs(F3)),[-1 5],'InitialMagnification','fit');colormap(jet);

image.gif编辑

图2.5.3-1 对矩阵进行傅里叶反变换

       由于进行傅里叶变换的是矩阵,将空域转换成了频域,而傅里叶反变换则将空域 转换回频域,重新显现出原来的图形。

②对(2)中的图像进行反变换

K=idct2(J);

figure,imshow(K,[0 255])

image.gif编辑

图2.5.3-2 DCT逆变换

       DCT可以用于对图片进行压缩,DCT过程是将空域转换为频域的过程,而经过DCT逆变换则可以将频域转换为空域,将图像还原。

五:不同的图像内容与FFT、DCT频谱之间的对应关系

       进行傅里叶变换(FFT2)后,频谱的低频部分主要集中在四周,中间则为高频部分; 而DCT则从左上角到右下角从低频到高频,系数逐渐减小。相同点为图像能量均集中在 低频部分,低频系数体现出图像中目标的轮廓和灰度分布特性,高频系数体现了目标形 状细节。需要注意的是,频谱图上各点和原图像不存在一一对应的关系,即使是在不移 频的情况下也没有。

相关文章
|
9月前
|
机器学习/深度学习 自然语言处理 文字识别
【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)
我们推出了一个名为CLIP的神经网络,它可以有效地从自然语言监督中学习视觉概念。CLIP可以应用于任何视觉分类基准,只需提供要识别的视觉类别名称,类似于GPT-2和GPT-3的“零样本”功能。
|
4月前
|
机器学习/深度学习 计算机视觉 Python
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
61 0
|
4月前
|
机器学习/深度学习 自动驾驶 算法
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
69 1
|
6月前
|
算法 vr&ar 计算机视觉
[笔记]Python计算机视觉编程《二》 基本的图像操作和处理
[笔记]Python计算机视觉编程《二》 基本的图像操作和处理
|
6月前
|
存储 算法 程序员
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(四)
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(四)
|
6月前
|
存储 Serverless C语言
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(三)
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(三)
|
6月前
|
安全 数据挖掘 计算机视觉
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(二)
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(二)
|
6月前
|
XML 算法 计算机视觉
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理(一)
[笔记]Python计算机视觉编程《一》 基本的图像操作和处理
|
8月前
|
机器学习/深度学习 决策智能 计算机视觉
计算机视觉实战(四)图像形态学操作
计算机视觉实战(四)图像形态学操作
|
8月前
|
机器学习/深度学习 决策智能 计算机视觉
计算机视觉实战(二)图像基本操作
计算机视觉实战(二)图像基本操作