数学文化课程报告
傅里叶变换在数字图像处理中的应用
成绩:
傅里叶变换在数字图像处理中的应用
朱德辉
中国石油大学华东地球科学与技术学院山东青岛 266580
摘要:文章将“傅里叶变换”这种计算工具与图像分析有机结合起来, 将“傅里叶变换”应用
到空间频谱处理当中, 并将结果以最直观的方式—图形表示出来; 文章意在说明
用一种实用的方法对数字图像进行处理。
关键词:傅里叶变换数字图像处理图像滤波图像压缩图像恢复
Application of Fourier Transform in Digital Image Process
ZhuDehui
China University of Petroleum Global Scientific and Technological
ShanDong Qingdao 266580
Abstract : This article states the organic combination of the formula named Fourier transform and the analysis of image . The Fourier transform can be used in dealing with the 3-dimen -tion -space frequency curve chart ; meanwhile , it can also show us directly by image . The article is meant to seek a practical way being used in digital image process .
Keywords : Fourier transform , digital image processing , image filter , image compression , image restoration
引言
近年来, 随着电子技术、图像处理方法和信号理论的迅猛发展, 数字图像处理技术得到飞速发展, 它广泛应用于几乎所有与成像有关的领域。传统的光学系统在信号处理时 ,存有它自身很难克服的不足 : 第一 ,它对空间频谱平面的处理很难, 尤其在低频和甚低频时 ,即使可通过大量仪器来实现 ,但代价往往很高 ;第二 ,光学处理由于采样孔径(即传感单元) 太窄而不能起到抗混叠作用 ,不能除去高频信息。而傅里叶变换和线性移不变系统有紧密联系, 它有一个很好的理论背景来指导它在图像处理中的作用 , 可以方便有效地克服上述不足 , 使其在数字图像处理中占有一席之地。
方法与原理
本文以计算机为工具, 以C 语言编程为手段, 通过快速离散傅里叶变换与C 语言 利用傅里叶变换对空间频谱平面进行处理。在本文中, 我们所用到的有关公式和原理有:
二维离散傅里叶正变换为:
H (n 1, n 2) =
exp(2πik n ∑∑k k
2-0
1-0
N 2-1N 1-1
22
/N 2)exp(2πik 1n 1/N 1) h (k 1, k 2)
二维离散傅里叶逆变换:
其中, h (k 1, k 2) 是一个定义在二维网格0≤k 1≤N 1-1 , 0 ≤k 2≤N 2-1 上的复函数(就像用等间距
的矩形网格对一个二维连续函数采样所得的数组), H (n 1 ,n 2) 是二维离散傅里叶变换后的复函数
h (k1, k 2) =
1
N 2-1N 1-1
2-0
1-0
N 1N 2
exp(-2πik n ∑∑n n
22
/N 2)exp(-2πik 1n 1/N 1) H (k 1, k 2) ,
N 1、N 2为数组的有效界长。
本程序用基-2频域抽取法蝶形运算, 有关此运算详细资料请参阅《数字信号处理》一书中“离散傅里叶变换”一章。
程序中所用主要子程序简介:
①init ():将图形驱动软件装入内存, 使屏幕适配器设置为图形方式, 即图形初始化; ②make _original _data ():置数程序, 以取得有关二维数组, 进行傅里叶变换;
③do _2D _DFT ():完成二维离散傅里叶正变换, 通过绘图程序将运算结果显示在屏幕上; ④do _2D _IDFT ():完成二维离散傅里叶逆变换, 通过绘图程序将运算结果显示在屏幕上, 使其与原图形相比较, 以检验变换的恢复情况;
⑤filter ():在这个子程中, 我们可以通过选择有效对空间频谱进行滤波, 滤去不需要谱线, 保留有效谱线, 突出重要部分, 削弱次要因素, 达到对空间频谱处理目的。
程序设计
图一程序流程图
主要子程序:
}
{int imin , imax, jmin , jmax , fg=1 ; char c ;
outtextxy(100, 430 , ”filter? (Y/ N):”); c=getch();delline();
if(c ==' y' c==' Y' ) {
while(fg) {gotoxy(60 , 21);
printf(” 0 %d :” ,(size >>1)); gotoxy(60 , 22); printf(”input imin :”);scanf(” %d” , &imin); gotoxy(60 , 23);
printf(”input imax :”);scanf(” %d” , &imax); gotoxy(60 , 24);
do_2D_DFT() { getch();
fft2(xx ,yy , 1); disp_fft(200 , 360 , 6, 0 .03); gotoxy(30 ,25);printf(” 2D-FFT ”);
printf(”input jmin :”);scanf(” %d” , &jmin); gotoxy(60 , 25);
printf(”input jmax :”); scanf(”%d” , &jmax); fg=filter(imin , imax , jmin , jmax);
}
setfillstyle(EMPTY_FILL ,0); bar3d(0 , 220 , 639 ,420, 0 , 0);
disp_fft(160 , 380 , 6 ,0 .03); }
fft2(xx, yy , -1); disp_data(325 ,164 , 2 , 0.5);
gotoxy(42 , 13);printf(” 2D -IFFT ”); if(c==' y' c ==' Y' ) {gotoxy(56 , 12); printf(” i :%2d %2d n” , imin ,imax);
gotoxy(56 , 13);
printf(”j :%2d %2d n ” , jmin , jmax); }
}
;------------------------
fft2(xx, yy , flag)
float xx[ SIZE][ SIZE] , yy[ SIZE] [ SIZE] ; int flag ; { float x[ SIZE] , y[ SIZE] ; int i , j ; for(i=0;i
{x[ j] =xx[ j] [ i] ;y[ j] =yy[ j] [ i] ;} fft1(x , y, flag);
for(j=0;j
{xx[ j] [ i] =x[ j] ;yy[ j] [ i] =y[ j] ;}}
for(i=0;i
{ for(j=0 ;j
{ x[ j] =xx[ i] [ j] ;y[ j] =yy[ i] [ j] ;} fft1(x , y, flag); for(j=0;j
{xx[ i] [ j] =x[ j] ;yy[ i] [ j] =y[ j] ;}}}
;--------------------------
fft1(xx ,yy, flag)
float xx[ ] , yy[ ] ;
int flag ; {
int dn, pow ,m , j1 , j2 , i , j , k , ndv2 , arg , w ; float c, s , t1 , t2 ; mk_table();
dn =size; w =1 ; pow =ketasuu(size); for(i=0 ;i
m =dn ; dn =dn/2 ; arg =0 ; for(j=0 ;j
c =_cos[ arg] ; s =-flag *_sin[ arg] ;
arg =arg +w ; k =m ; do{
j1 =k -m +j ; j2 =j1 +dn ; t1 =xx[ j1] -xx[ j2] ; t2 =yy[ j1] -yy[ j2] ;
xx[ j1] =xx[ j1] +xx[ j2] ; yy[ j1] =yy[ j1] +yy[ j2] ; xx[ j2] =(c *t1 +s *t2); yy[ j2] =(c*t2 -s *t1); k =k +m ; }while(k
w =w *2 ;}
j =0 ; ndv2 =size/ 2 ; for(i=0 ;i
if(i
{ t1 =xx[ j] ; t2=yy[ j] ; xx[ j] =xx[ i] ; yy[ j] =yy[ i] ; xx[ i] =t1 ; yy[ i] =t2 ;}
k =ndv2 ; while(k
k =k/2 ;}
j =j +k ;}
if(flag ==-1) for(j=0 ;j
{ xx[ j] =xx[ j] / size; yy[ j] =yy[ j] / size; } }
;--------------------------
filter(imin , imax , jmin , jmax) int imin , imax , jmin , jmax ; {
int i , j , n , r, h , fg=1 ; n =size >>1 ; n =n+2 ;
if(imin >=0&&jmin >=0&&imax
for(i=0;i
{ for(j=jmin ;j
for(j=0;j
{ for(i=imin ;i
} }
return(fg); }
;--------------------------
disp_fft(sx , sy , col , ratio) int sx, sy , col ; double ratio ;
{int i , j , n ; n =size/2 ;
for(i=0;i
sdat[ i] [ j] =sqrt(xx[ i] [ j] *xx[ i] [ j] +yy[ i] [ j] *yy[ i] [ j] ); else sdat[ i] [ j] =0 ;
draw_graph(sx , sy , col , 2 , ratio); }
图形效果:
图 2 、图 3 中, 红色图形为原数据图形, 橙色为进行傅里叶正变换后的图形 ,绿色为进行傅里叶正变换 ,再进行傅里叶逆变换所得图形。图 2a 、图 2b 为同一数组生成的图形 ,图 2a 未进行滤波 ,图 2b 进行i 轴 3 ~ 10 范围、j 轴 6 ~ 8 范围内滤波。图 3a 、图3b 为同一数组生成的图形, 图3a 未进行滤波, 图 3b 进行 i 轴 2 ~ 8 范围、j 轴5 ~ 9 范围内滤波。
傅里叶变换在数字图像处理中的作用
我们通过上述程序, 以很方便的形式达到了对空间频谱进行滤波的目的, 傅里叶变换的作用不止于此 ,主要表现在以下几个方面: 图像保存:从上述图像变换可以看出, 傅里叶正变换将图像分解为一组越来越小的正交归一图像 , 具有很高的压缩比仍能够将原始数据完全恢复而不引入任何失真。当我们希望将一幅图像以一种更紧凑的数据格式进行编码, 同时保持数据不丢失时, 傅里叶变换是一个很好的工具。
图像滤波:在进行傅里叶变换后, 若在反变换之前对变换域进行选择 ,可对图像进行滤波处理。
图形增强:正变换将一幅图像分解为大小、位置和方向都不同的分量, 在逆变换之前改变域中某些系数的幅度, 有选择提升感兴趣的分量 ,而忽略不需要的东西 ;或根据实际需要 ,缔造一个传递函数 , 在变换域将频谱乘以传递函数, 再进行傅里叶逆变换来实现。当然, 这个实现过程需要很好地设计传递函数。
图像复原:目标是对退化的图像进行处理 ,使它复原成没有退化的理想图像。成像过程的每一个环节(透镜、感光片、数字化) 都能引起退化 , 我们可视具体应用的不同, 将损失掉的图像部分恢复过来 ,以起到很重要的作用。例如, 图像上的污点 ,我们可以利用信息的相关性, 通过傅里叶卷积来达到隐去污点之目的 ;对于天文现象像太空研究中月球或行星图像的获取 ,摄取特定信息, 利用谱线的相关性, 通过频谱分析 ,再现物体之原貌。
结束语
近年来, 人们对一些新的变换技术产生了相当浓厚的兴趣, 这些新的变换技术是专门面向图像压缩、边缘和特征检测以及纹理分析的。傅里叶变换很好的理论背景, 使其在空间滤波、光学信息处理中发挥着重要作用。随着图像处理所用的计算机设备不断降价, 随着支持傅里叶变换的硬件的出现, 傅里叶变换在数字图像处理领域将得到进一步发展。
参考文献
[ 1 ] 数字图像处理/(美) 卡斯尔曼(Castleman , k .R)著; 朱志刚等译。 -北京:电子工业出版社, 2002.2
[ 2] 计算机图形学/ 孙家广等主编。 -3 版。 -北京:清华大学出版社 1998.9 [ 3 ]快速傅里叶变换:算法与应用(美)(K.R.Rao )著 2013.3
数学文化课程报告
傅里叶变换在数字图像处理中的应用
成绩:
傅里叶变换在数字图像处理中的应用
朱德辉
中国石油大学华东地球科学与技术学院山东青岛 266580
摘要:文章将“傅里叶变换”这种计算工具与图像分析有机结合起来, 将“傅里叶变换”应用
到空间频谱处理当中, 并将结果以最直观的方式—图形表示出来; 文章意在说明
用一种实用的方法对数字图像进行处理。
关键词:傅里叶变换数字图像处理图像滤波图像压缩图像恢复
Application of Fourier Transform in Digital Image Process
ZhuDehui
China University of Petroleum Global Scientific and Technological
ShanDong Qingdao 266580
Abstract : This article states the organic combination of the formula named Fourier transform and the analysis of image . The Fourier transform can be used in dealing with the 3-dimen -tion -space frequency curve chart ; meanwhile , it can also show us directly by image . The article is meant to seek a practical way being used in digital image process .
Keywords : Fourier transform , digital image processing , image filter , image compression , image restoration
引言
近年来, 随着电子技术、图像处理方法和信号理论的迅猛发展, 数字图像处理技术得到飞速发展, 它广泛应用于几乎所有与成像有关的领域。传统的光学系统在信号处理时 ,存有它自身很难克服的不足 : 第一 ,它对空间频谱平面的处理很难, 尤其在低频和甚低频时 ,即使可通过大量仪器来实现 ,但代价往往很高 ;第二 ,光学处理由于采样孔径(即传感单元) 太窄而不能起到抗混叠作用 ,不能除去高频信息。而傅里叶变换和线性移不变系统有紧密联系, 它有一个很好的理论背景来指导它在图像处理中的作用 , 可以方便有效地克服上述不足 , 使其在数字图像处理中占有一席之地。
方法与原理
本文以计算机为工具, 以C 语言编程为手段, 通过快速离散傅里叶变换与C 语言 利用傅里叶变换对空间频谱平面进行处理。在本文中, 我们所用到的有关公式和原理有:
二维离散傅里叶正变换为:
H (n 1, n 2) =
exp(2πik n ∑∑k k
2-0
1-0
N 2-1N 1-1
22
/N 2)exp(2πik 1n 1/N 1) h (k 1, k 2)
二维离散傅里叶逆变换:
其中, h (k 1, k 2) 是一个定义在二维网格0≤k 1≤N 1-1 , 0 ≤k 2≤N 2-1 上的复函数(就像用等间距
的矩形网格对一个二维连续函数采样所得的数组), H (n 1 ,n 2) 是二维离散傅里叶变换后的复函数
h (k1, k 2) =
1
N 2-1N 1-1
2-0
1-0
N 1N 2
exp(-2πik n ∑∑n n
22
/N 2)exp(-2πik 1n 1/N 1) H (k 1, k 2) ,
N 1、N 2为数组的有效界长。
本程序用基-2频域抽取法蝶形运算, 有关此运算详细资料请参阅《数字信号处理》一书中“离散傅里叶变换”一章。
程序中所用主要子程序简介:
①init ():将图形驱动软件装入内存, 使屏幕适配器设置为图形方式, 即图形初始化; ②make _original _data ():置数程序, 以取得有关二维数组, 进行傅里叶变换;
③do _2D _DFT ():完成二维离散傅里叶正变换, 通过绘图程序将运算结果显示在屏幕上; ④do _2D _IDFT ():完成二维离散傅里叶逆变换, 通过绘图程序将运算结果显示在屏幕上, 使其与原图形相比较, 以检验变换的恢复情况;
⑤filter ():在这个子程中, 我们可以通过选择有效对空间频谱进行滤波, 滤去不需要谱线, 保留有效谱线, 突出重要部分, 削弱次要因素, 达到对空间频谱处理目的。
程序设计
图一程序流程图
主要子程序:
}
{int imin , imax, jmin , jmax , fg=1 ; char c ;
outtextxy(100, 430 , ”filter? (Y/ N):”); c=getch();delline();
if(c ==' y' c==' Y' ) {
while(fg) {gotoxy(60 , 21);
printf(” 0 %d :” ,(size >>1)); gotoxy(60 , 22); printf(”input imin :”);scanf(” %d” , &imin); gotoxy(60 , 23);
printf(”input imax :”);scanf(” %d” , &imax); gotoxy(60 , 24);
do_2D_DFT() { getch();
fft2(xx ,yy , 1); disp_fft(200 , 360 , 6, 0 .03); gotoxy(30 ,25);printf(” 2D-FFT ”);
printf(”input jmin :”);scanf(” %d” , &jmin); gotoxy(60 , 25);
printf(”input jmax :”); scanf(”%d” , &jmax); fg=filter(imin , imax , jmin , jmax);
}
setfillstyle(EMPTY_FILL ,0); bar3d(0 , 220 , 639 ,420, 0 , 0);
disp_fft(160 , 380 , 6 ,0 .03); }
fft2(xx, yy , -1); disp_data(325 ,164 , 2 , 0.5);
gotoxy(42 , 13);printf(” 2D -IFFT ”); if(c==' y' c ==' Y' ) {gotoxy(56 , 12); printf(” i :%2d %2d n” , imin ,imax);
gotoxy(56 , 13);
printf(”j :%2d %2d n ” , jmin , jmax); }
}
;------------------------
fft2(xx, yy , flag)
float xx[ SIZE][ SIZE] , yy[ SIZE] [ SIZE] ; int flag ; { float x[ SIZE] , y[ SIZE] ; int i , j ; for(i=0;i
{x[ j] =xx[ j] [ i] ;y[ j] =yy[ j] [ i] ;} fft1(x , y, flag);
for(j=0;j
{xx[ j] [ i] =x[ j] ;yy[ j] [ i] =y[ j] ;}}
for(i=0;i
{ for(j=0 ;j
{ x[ j] =xx[ i] [ j] ;y[ j] =yy[ i] [ j] ;} fft1(x , y, flag); for(j=0;j
{xx[ i] [ j] =x[ j] ;yy[ i] [ j] =y[ j] ;}}}
;--------------------------
fft1(xx ,yy, flag)
float xx[ ] , yy[ ] ;
int flag ; {
int dn, pow ,m , j1 , j2 , i , j , k , ndv2 , arg , w ; float c, s , t1 , t2 ; mk_table();
dn =size; w =1 ; pow =ketasuu(size); for(i=0 ;i
m =dn ; dn =dn/2 ; arg =0 ; for(j=0 ;j
c =_cos[ arg] ; s =-flag *_sin[ arg] ;
arg =arg +w ; k =m ; do{
j1 =k -m +j ; j2 =j1 +dn ; t1 =xx[ j1] -xx[ j2] ; t2 =yy[ j1] -yy[ j2] ;
xx[ j1] =xx[ j1] +xx[ j2] ; yy[ j1] =yy[ j1] +yy[ j2] ; xx[ j2] =(c *t1 +s *t2); yy[ j2] =(c*t2 -s *t1); k =k +m ; }while(k
w =w *2 ;}
j =0 ; ndv2 =size/ 2 ; for(i=0 ;i
if(i
{ t1 =xx[ j] ; t2=yy[ j] ; xx[ j] =xx[ i] ; yy[ j] =yy[ i] ; xx[ i] =t1 ; yy[ i] =t2 ;}
k =ndv2 ; while(k
k =k/2 ;}
j =j +k ;}
if(flag ==-1) for(j=0 ;j
{ xx[ j] =xx[ j] / size; yy[ j] =yy[ j] / size; } }
;--------------------------
filter(imin , imax , jmin , jmax) int imin , imax , jmin , jmax ; {
int i , j , n , r, h , fg=1 ; n =size >>1 ; n =n+2 ;
if(imin >=0&&jmin >=0&&imax
for(i=0;i
{ for(j=jmin ;j
for(j=0;j
{ for(i=imin ;i
} }
return(fg); }
;--------------------------
disp_fft(sx , sy , col , ratio) int sx, sy , col ; double ratio ;
{int i , j , n ; n =size/2 ;
for(i=0;i
sdat[ i] [ j] =sqrt(xx[ i] [ j] *xx[ i] [ j] +yy[ i] [ j] *yy[ i] [ j] ); else sdat[ i] [ j] =0 ;
draw_graph(sx , sy , col , 2 , ratio); }
图形效果:
图 2 、图 3 中, 红色图形为原数据图形, 橙色为进行傅里叶正变换后的图形 ,绿色为进行傅里叶正变换 ,再进行傅里叶逆变换所得图形。图 2a 、图 2b 为同一数组生成的图形 ,图 2a 未进行滤波 ,图 2b 进行i 轴 3 ~ 10 范围、j 轴 6 ~ 8 范围内滤波。图 3a 、图3b 为同一数组生成的图形, 图3a 未进行滤波, 图 3b 进行 i 轴 2 ~ 8 范围、j 轴5 ~ 9 范围内滤波。
傅里叶变换在数字图像处理中的作用
我们通过上述程序, 以很方便的形式达到了对空间频谱进行滤波的目的, 傅里叶变换的作用不止于此 ,主要表现在以下几个方面: 图像保存:从上述图像变换可以看出, 傅里叶正变换将图像分解为一组越来越小的正交归一图像 , 具有很高的压缩比仍能够将原始数据完全恢复而不引入任何失真。当我们希望将一幅图像以一种更紧凑的数据格式进行编码, 同时保持数据不丢失时, 傅里叶变换是一个很好的工具。
图像滤波:在进行傅里叶变换后, 若在反变换之前对变换域进行选择 ,可对图像进行滤波处理。
图形增强:正变换将一幅图像分解为大小、位置和方向都不同的分量, 在逆变换之前改变域中某些系数的幅度, 有选择提升感兴趣的分量 ,而忽略不需要的东西 ;或根据实际需要 ,缔造一个传递函数 , 在变换域将频谱乘以传递函数, 再进行傅里叶逆变换来实现。当然, 这个实现过程需要很好地设计传递函数。
图像复原:目标是对退化的图像进行处理 ,使它复原成没有退化的理想图像。成像过程的每一个环节(透镜、感光片、数字化) 都能引起退化 , 我们可视具体应用的不同, 将损失掉的图像部分恢复过来 ,以起到很重要的作用。例如, 图像上的污点 ,我们可以利用信息的相关性, 通过傅里叶卷积来达到隐去污点之目的 ;对于天文现象像太空研究中月球或行星图像的获取 ,摄取特定信息, 利用谱线的相关性, 通过频谱分析 ,再现物体之原貌。
结束语
近年来, 人们对一些新的变换技术产生了相当浓厚的兴趣, 这些新的变换技术是专门面向图像压缩、边缘和特征检测以及纹理分析的。傅里叶变换很好的理论背景, 使其在空间滤波、光学信息处理中发挥着重要作用。随着图像处理所用的计算机设备不断降价, 随着支持傅里叶变换的硬件的出现, 傅里叶变换在数字图像处理领域将得到进一步发展。
参考文献
[ 1 ] 数字图像处理/(美) 卡斯尔曼(Castleman , k .R)著; 朱志刚等译。 -北京:电子工业出版社, 2002.2
[ 2] 计算机图形学/ 孙家广等主编。 -3 版。 -北京:清华大学出版社 1998.9 [ 3 ]快速傅里叶变换:算法与应用(美)(K.R.Rao )著 2013.3