数字图像处理- 图像平滑与锐化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

原始图像到复数数组的转化
傅里叶正变换 低通滤波
傅里叶逆变换
复数数组到结果图像的转化
数字图像处理
22
// 1)原始图像到复数数组的转化 CTArray< complex > array_of_complex = CImageProcessing::Image_to_complex( m_image.Get_gray_image(), new_height, new_width ); // 2)傅里叶正变换 complex* pointer_of_complex = new complex [ array_of_complex.GetDimension() ]; array_of_complex.ExportTo( pointer_of_complex ); CImageProcessing::forward_fft2d( pointer_of_complex, new_height, new_width ); array_of_complex.ImportFrom( pointer_of_complex );

将原始图像转化为复数数组进行傅里叶正变换,输 出得到原始变换域; 对原始变换域进行频域上的处理,如低通滤波,得 到滤波后的变换域; 将滤波后的变换域进行傅里叶逆变换,便得到最终 的复数数组,取复数的实部信息便可以得到低通滤 波后的图像结果。

数字图像处理
14
低通滤波,就是将高频信息剔除,只保留低频信息, 对于空域图像结果而言就是图像变得模糊(或者说 平滑)了,因为抑制了图像的边缘信息; 而对于频域中间结果图像而言,就是图像四周的信 息被抑制了,看起来就是中间低频信息所占区域变 小了。
数字图像处理
19

对于一般的频率信息的显示,则需要取复数的幅度 作为显示图像的像素值,并且考虑到灰度像素的值 域(0-255)问题,需要除以一个常量(如100)来 使得人眼能够看到频率的变化信息。
CTMatrix< BYTE > CImageProcessing::Display_frequency( const CTArray< complex >& complex_array, long image_height, long image_width ) { CTMatrix< BYTE > gray_image( image_height, image_width ); ASSERT( complex_array.GetDimension() == image_height * image_width ); for( int row = 0; row < image_height; row ++ ) for( int column = 0; column < image_width; column ++ ) gray_image[ row ][ column ] = BYTE( sqrt( complex_array[ row * image_width + column ].m_re * complex_array[ row * image_width + column ].m_re + complex_array[ row * image_width + column ].m_im * complex_array[ row * image_width + column ].m_im ) / 100.0 ); return gray_image; }
数字图像处理
18
对于最后的复数数组向空域图像转换的问题,
只要取复数的实部作为图像像素的灰度值就可 以了。
CTMatrix< BYTE > CImageProcessing::Complex_to_image( const CTArray< complex >& complex_array, long image_height, long image_width ) { CTMatrix< BYTE > gray_image( image_height, image_width ); ASSERT( complex_array.GetDimension() == image_height * image_width ); for( int row = 0; row < image_height; row ++ ) for( int column = 0; column < image_width; column ++ ) gray_image[ row ][ column ] = BYTE( complex_array[ row * image_width + column ].m_re ); return gray_image; }

数字图像处理
15

傅里叶变换是基于复数空间的,所以需要一个基本 的数据结构来表示复数,为

typedef struct {double m_re; double m_im;} complex;, 其中m_re为实部,m_im为虚部。
int CImageProcessing::forward_fft2d(complex *array, int rows, int cols) { return(fft2d(array, rows, cols, FFT_FORWARD)); } int CImageProcessing::inverse_fft2d(complex *array, int rows, int cols) { return(fft2d(array, rows, cols, FFT_INVERSE)); }
巴特沃斯滤波 器 切比雪夫滤波 器 椭圆滤波器
数字图像处理
5

数字图像处理
6
切比雪夫滤波器是在通带或阻带上频率响应幅
度等波纹波动的滤波器。 切比雪夫滤波器在过渡带比巴特沃斯滤波器衰 减要快,但是频率响应的幅频特性不如巴特沃 斯滤波器平坦。

在通带波动的切比雪夫滤波器的数学表达为

在阻带波动的切比雪夫滤波器的数学表达为
数字图像处理
16
最直观的做法,就是将每一个像素的灰度值作
为每一个复数的实部,实际上这个做法是完全 正确的。 但是,如何设置复数的虚部呢?

至此,读者应该能想到,设置为0。 这样,原始图像的总像素个数就是复数数组的维数, 每个复数的实部就对应像素的灰度,虚部设为0。
数字图像处理
17
CTArray< complex > CImageProcessing::Image_to_complex( const CTMatrix< BYTE >& gray_image, long& new_height, long& new_width ) { long image_height = gray_image.Get_height(); long image_width = gray_image.Get_width(); new_height = image_height; new_width = image_width; if( !( power_of_2( image_height ) ) ) new_height = long( pow( 2.0f, fastlog2( image_height ) ) ); if( !( power_of_2( image_width ) ) ) new_width = long( pow( 2.0f, fastlog2( image_width ) ) ); CTArray< complex > array_of_complex( new_height * new_width ); for( int row = 0; row < new_height; row ++ ) for( int column = 0; column < new_width; column ++ ) { array_of_complex[ row * new_width + column ].m_re = gray_image[ row ][ column ]; array_of_complex[ row * new_width + column ].m_im = 0; } return array_of_complex; }
数字图像处理
7

数字图像处理
8
巴特沃斯滤波器
通带波动下的切比雪夫滤波器
阻带波动下的切比雪夫滤波器
数字图像处理
椭圆函数滤波器
9

数字图像处理
10
数字图像处理
11
数字图像处理
12

数字图像处理
13

涉及4种图像初始、中间或最终结果,和三个主要 处理步骤。
图像结果包括原始图像、原始变换域、滤波后的变换域 和滤波后的图像; 处理步骤包括傅里叶正变换、低通滤波和傅里叶逆变换。
由于人类视觉系统的特性,锐化后的图像看起
Hale Waihona Puke Baidu
来更加清晰,但是实际上锐化操作并没有提高 真正的分辨率。
2
数字图像处理
数字图像处理
3
低通滤波法
中值滤波法
高斯滤波法
均值滤波法
数字图像处理
4
低通滤波器,就是通过低频信号且抑制高频信
号的滤波器。 一个理想的低通滤波器,就是能够完全剔除高 于截止频率的所有信号,并且保留所有低于截 止频率的信号。 在实时应用中,实际滤波器可以通过将信号延 长一小段时间以得到未来的一小部分信号信息, 这样就可以近似的实现理想滤波器。
// 3)低通滤波
array_of_complex = CImageProcessing::Low_pass_filter( array_of_complex ); // 4)傅里叶逆变换 array_of_complex.ExportTo( pointer_of_complex ); CImageProcessing::inverse_fft2d( pointer_of_complex, new_height, new_width ); array_of_complex.ImportFrom( pointer_of_complex ); delete [] pointer_of_complex; // 5)复数数组到结果图像的转化 CTMatrix< BYTE > filter_image = CImageProcessing::Complex_to_image( array_of_complex, new_height, new_width );
配套课件 数字图像处理 — 编程框架、理论分析、实例应用和源码实现
数字图像处理
1
在统计学和图像处理领域中,对一个数据集
(如图像)进行平滑就是产生一个近似的函数, 目的是尝试获取数据的重要模式特征,并忽略 噪声或者其它的细微结构信息。 在图像处理和计算机视觉领域,平滑的概念通 常被用于尺度空间的表示中。
数字图像处理
20
CTArray< complex > CImageProcessing::Low_pass_filter( CTArray< complex > original_signal ) { long dimension = original_signal.GetDimension(); double threshold = 0; for( int index = 0; index < dimension; index ++ ) { double magnitude = sqrt( original_signal[ index ].m_re * original_signal[ index ].m_re + original_signal[ index ].m_im * original_signal[ index ].m_im ); if( magnitude > threshold ) threshold = magnitude; } threshold /= 100; for( int index = 0; index < dimension; index ++ ) { double magnitude = sqrt( original_signal[ index ].m_re * original_signal[ index ].m_re + original_signal[ index ].m_im * original_signal[ index ].m_im ); double eplon = 1.0 / sqrt( 1 + ( threshold / magnitude ) * ( threshold / magnitude ) ); original_signal[ index ].m_re *= eplon; original_signal[ index ].m_im *= eplon; } return original_signal; } 21 数字图像处理
相关文档
最新文档