快速中值滤波算法

合集下载

改进的中值滤波算法在图像去噪中的应用

改进的中值滤波算法在图像去噪中的应用

b s d f r d g t li a e e lt e p o e sn ; t e weg t d a a tv e in fle i g a g ~ e u e o i i m g s r a— i r c s i g h i h e d p i e m d a i r n l o a m t
第3 2卷 第 4期
21 0 1年 7月

用 光

V 0.3 I 2 No. 4
J u n lo pid Op is o r a fAp l t e c
J 12 1 u. 0 1
文 章 编 号 : 0 22 8 ( 0 1 0 — 6 8 0 10 —0 2 2 1 )40 7— 5
ZH AO o c n ,ZH ANG i Ga — ha g Le ,W U n b Fe g— o
( . c o lo ce c ,Xi n Un v r i fS in e a d Te h o o y 1 S h o fS in e ’ ie st o ce c n c n l g ,Xi n 7 0 5 , hia; a y ’ 1 0 4 C n a
中图分类号 : TN2 9 TP 9 . 1 0 ; 3 14 文献标志码 : A
Ap i a i n o m pr v d m e i n f le i l o ih o i a e d — o sng plc to f i o e d a it rng a g r t m t m g e n ii
2 S h o fIf r t n E gn eig,Xi n Unv ri fS in e& Te h oo y, ’n 7 0 5 Chn ) . c o l no mai n ie r o o n ’ iest o ce c a y c n lg Xi 1 0 4, ia a

均值滤波和中值滤波

均值滤波和中值滤波

均值滤波和中值滤波
均值滤波和中值滤波是图像处理的两种常用的滤波算法,它们的目的都是为了去掉图像中的噪声,以使图像变得更清晰,以满足下一步处理所需。

均值滤波是一种很常见的滤波算法。

该算法通过统计一定形状的邻域窗口内像素的灰度值,将窗口中各点像素的灰度值求平均,然后将新的灰度值赋给窗口中的每一点像素,从而进行滤波。

由于噪声的特性,噪声点往往灰度值低于其它像素,因此采用均值滤波的过滤效果良好,能够很好的消除噪声,但是也会消除掉有帮助的图像信息,因此多数情况下只是用于滤除少量的随机噪声,而不能用于去除椒盐噪声。

中值滤波则是另一种常用的滤波算法。

它的原理是通过统计一定范围内像素的中位数来进行滤波。

先以块为单位,确定该块中某一点处的灰度值。

然后,把该点所在连通区域的所有点的灰度值读取出来排序,去掉最大值和最小值,再求中间的中位数,将这个中位数作为该点处的灰度值,从而进行滤波处理。

中值滤波主要用于滤除椒盐噪声,可以更好的保留原始图像的信息,但是它的耗时较多,且由于中位数的计算,比较麻烦。

总之,均值滤波和中值滤波作为图像滤波的两种常用技术,具有他们各自良好的应用特点和优势,根据不同的情况和需求,可以采用适当的技术进行滤波,以满足下一步处理的条件。

基于FPGA的中值滤波算法研究与硬件设计

基于FPGA的中值滤波算法研究与硬件设计
Ab t a t sr c :Ba e n F GA lto m, t eu eo VHDL h r wa e e c i t n ln u g e in a d i l me tt n o s dO P p af r wi t s f hh a d r s r i g a et d sg d p o a o n mp e n a i f o me i f t r g a g rtm f ri a ep o e sn . n t ed sg p o e s t r u h i p o e ag r h d o t zn h e da i ei lo i n l n h o m g rc sig I h ei n r c s , h o g m r v d l o t ms a p i i gt i n mi
编程器件的基础上进一步发展的产物。它是作为专 用集 成 电路 ( I ) ASC 领域 中的一种半 定制 电路 而出现
的 。既解 决 了定制 电路 的不 足 ,又克服 了原有 可编 程器件 门电路 数有 限的 缺点 。根据 面阵 C D 器 件 C 驱 动 要 求 ,采 用 此 项 技 术 进 行 了 图 像 处 理 专 用 F G 芯片设 计 ,对完 成 以 F G 图像处 理芯 片为 PA PA 核心 的实时 图像处 理系 统 的设计 有重 要意 义 。
中值滤波是一种非线性的图像平滑方法 ,与均
值滤 波器 以及 其它线 性 滤波器 相 比 ,它能够很 好地 滤 除脉 冲噪声 ,同时又 能够保 护 目标 图像边缘 。它
是一种邻域运算 , 类似于卷积 ,但计算的不是加权 求和 ,而是把邻域中的像素按灰度级进行排序 ,然
V0. 1 No 1 1 3 . Ma . o 8 r20

十大滤波算法

十大滤波算法

十大滤波算法滤波是一种常用的数据处理技术,用于有效构建和改善信号的质量,优化信号的性能。

通过滤波,可以有效地抑制信号中的噪声,从而提高信号的清晰度,改善信号的性能。

现在,在许多应用及其他领域中,滤波算法已经成为一个重要的研究课题。

首先,我们应该了解滤波算法有哪些,其中主要有十类滤波算法:低通滤波、带通滤波、带阻滤波、高通滤波、椭圆滤波、阶跃滤波、时间延迟滤波、均值滤波、中值滤波、振荡器滤波。

下面,我们来详细介绍这十类滤波算法。

1. 低通滤波:它是将所有高频成分从信号中滤除,保留低频成分的一种滤波器。

它可以有效地抑制信号中的噪声,提高信号的清晰度,同时改善信号的性能。

2.通滤波:它是一种仅保留低频和高频成分的滤波器,可以有效地去除中间频率的干扰成分,提高系统的鲁棒性。

3.阻滤波:它是滤除一定范围内的频率成分,保留高频成分和低频成分的一种滤波器。

它可以有效地利用低频成分进行模型适应,以解决信号的噪声问题。

4.通滤波:它是一种仅保留高频成分的滤波器,可以有效地滤除信号中的低频成分,增强信号的清晰度。

5.圆滤波:它是在低通滤波器和带通滤波器之间的一种滤波器,可以有效地去除信号中的噪声,提高信号的清晰度。

6.跃滤波:它是一种仅保留高频成分和低频成分的滤波器,可以有效地滤除信号中的中频成分,以消除信号中的干扰。

7.间延迟滤波:它是一种仅保留低频成分的滤波器,可以有效地抑制信号中的高频成分,提高信号的清晰度。

8.值滤波:它是一种仅保留低频成分的滤波器,可以有效地抑制信号中的噪声,提高信号的清晰度。

9. 中值滤波:它是一种仅保留低频成分的滤波器,可以有效地抑制信号中的噪声,提高信号的清晰度。

10.荡器滤波:它是一种放大和抑制信号中特定频率成分的滤波器,可以有效地改善信号的性能。

以上便是十大滤波算法,它们可以有效地分离信号中的高频、低频成分,抑制信号中的噪声,提高信号的清晰度,改善信号的性能。

因此,滤波算法在现代信号处理领域的应用也越来越广泛,并且取得了很好的效果。

常用的8种数字滤波算法

常用的8种数字滤波算法

常用的8种数字滤波算法摘要:分析了采用数字滤波消除随机干扰的优点,详细论述了微机控制系统中常用的8种数字滤波算法,并讨论了各种数字滤波算法的适用范围。

关键词:数字滤波;控制系统;随机干扰;数字滤波算法1引言在微机控制系统的模拟输入信号中,一般均含有各种噪声和干扰,他们来自被测信号源本身、传感器、外界干扰等。

为了进行准确测量和控制,必须消除被测信号中的噪声和干扰。

噪声有2大类:一类为周期性的,其典型代表为50 Hz 的工频干扰,对于这类信号,采用积分时间等于20 ms整倍数的双积分A/D转换器,可有效地消除其影响;另一类为非周期的不规则随机信号,对于随机干扰,可以用数字滤波方法予以削弱或滤除。

所谓数字滤波,就是通过一定的计算或判断程序减少干扰信号在有用信号中的比重,因此他实际上是一个程序滤波。

数字滤波器克服了模拟滤波器的许多不足,他与模拟滤波器相比有以下优点:(1)数字滤波器是用软件实现的,不需要增加硬设备,因而可靠性高、稳定性好,不存在阻抗匹配问题。

(2)模拟滤波器通常是各通道专用,而数字滤波器则可多通道共享,从而降低了成本。

(3)数字滤波器可以对频率很低(如0.01 Hz)的信号进行滤波,而模拟滤波器由于受电容容量的限制,频率不可能太低。

(4)数字滤波器可以根据信号的不同,采用不同的滤波方法或滤波参数,具有灵活、方便、功能强的特点。

2 常用数字滤波算法数字滤波器是将一组输入数字序列进行一定的运算而转换成另一组输出数字序列的装置。

设数字滤波器的输入为X(n),输出为Y(n),则输入序列和输出序列之间的关系可用差分方程式表示为:其中:输入信号X(n)可以是模拟信号经采样和A/D变换后得到的数字序列,也可以是计算机的输出信号。

具有上述关系的数字滤波器的当前输出与现在的和过去的输入、过去的输出有关。

由这样的差分方程式组成的滤波器称为递归型数字滤波器。

如果将上述差分方程式中bK取0,则可得:说明输出只和现在的输入和过去的输入有关。

均值滤波,高斯滤波,中值滤波

均值滤波,高斯滤波,中值滤波

均值滤波,高斯滤波,中值滤波均值滤波,高斯滤波和中值滤波是数字图像处理中常用的三种平滑滤波技术,用于降低图像噪声和去除图像中的不相关细节。

本文将对这三种滤波方法进行介绍、比较和分析。

一、均值滤波均值滤波是一种简单的平滑滤波方法,它的原理是用滤波窗口内像素的平均值来代替中心像素的值。

具体来说,对于滤波窗口内的每个像素,计算其邻域内所有像素的平均值,然后将结果作为中心像素的值。

这样可以有效地平滑图像并去除高频噪声。

然而,均值滤波的缺点是它不能很好地保留图像的边缘信息,使得图像看起来模糊且失去细节。

二、高斯滤波高斯滤波是一种基于高斯分布的平滑滤波方法,它认为像素点的邻域内的像素值与中心像素点的距离越近,其权重越大。

它的滤波过程是在滤波窗口内,对每个像素点进行加权平均。

加权的权重由高斯函数决定,距离中心像素点越近的像素点的权重越大,距离越远的像素点的权重越小。

通过这种加权平均的方式,可以更好地保留图像的细节和边缘信息,同时有效地去除噪声。

高斯滤波的唯一缺点是计算复杂度较高,特别是对于大型滤波窗口和高分辨率图像来说。

三、中值滤波中值滤波是一种统计滤波方法,它的原理是用滤波窗口内像素的中值来代替中心像素的值。

具体来说,对于滤波窗口内的每个像素,将其邻域内的像素按照大小进行排序,然后将排序后像素的中值作为中心像素的值。

中值滤波对于椒盐噪声和脉冲噪声有很好的去噪效果,能够保持图像的边缘信息,避免了均值滤波和高斯滤波的模糊问题。

然而,中值滤波的缺点是不能去除高斯噪声和高频噪声,因为当滤波窗口内的像素含有这些噪声时,中值滤波会产生失真效果。

比较和分析:三种滤波方法各有优劣,应根据实际需求选择合适的滤波方法。

均值滤波是最简单、计算复杂度最低的方法,在去除高斯噪声和低频噪声方面效果较差,但对边缘信息的保留效果较差。

高斯滤波通过加权平均的方式更好地保留了图像的细节和边缘信息,适用于处理高斯噪声并且具有一定的平滑效果。

中值滤波对于椒盐噪声和脉冲噪声有很好的去噪效果,并保持了图像的边缘信息,但对于高斯噪声和高频噪声则效果较差。

中值滤波原理及MATLAB实现

中值滤波原理及MATLAB实现

中值滤波原理及MATLAB实现摘要:图像是一种重要的信息源,通过图像处理可以帮助人们了解信息的内涵。

本文将纯净的图像加入椒盐噪声,然后采用中值滤波的方法对其进行去噪。

中值滤波是一种常用的非线性信号处理技术,在图像处理中,它对滤除脉冲干扰噪声最为有效。

文章阐述了中值滤波的原理、算法以及在图像处理中的应用。

MATLAB 是一种高效的工程计算语言,在数据处理、图像处理、神经网络、小波分析等方面都有广泛的应用。

关键词:图像,中值滤波,去噪,MATLAB1.引言20世纪20年代,图像处理首次得到应用。

上个世纪60年代中期,随着计算机科学的发展和计算机的普及,图像处理得到广泛的应用。

60年代末期,图像处理技术不断完善,逐渐成为一个新兴的学科。

图像处理中输入的是质量低的图像,输出的是改善质量后的图像。

为了改善图像质量,从图像中提取有效信息,必须对图像进行去噪预处理。

根据噪声频谱分布的规律和统计特征以及图像的特点,出现了多种多样的去噪方法。

经典的去噪方法有:空域合成法,频域合成法和最优合成法等,与之适应的出现了许多应用方法,如均值滤波器,中值滤波器,低通滤波器,维纳滤波器,最小失真法等。

这些方法的广泛应用,促进数字信号处理的极大发展,显著提高了图像质量。

2.中值滤波在图像滤波中,常用的方法是线性滤波技术和非线性滤波技术,线性滤波以其完美的理论基础,数学处理简单、易于采用和硬件实现等优点,一直在图像滤波领域中占有重要的地位。

线性滤波对加性高斯噪声有较好的平滑作用,但对脉冲信号和其它形式的高频分量抑制效果较差,且模糊信号边缘。

非线性滤波是基于对输入信号序列的一种非线性投影关系,常把某一特定的噪声近似为零而保留信号的重要特征,一定程度上克服线性滤波器的不足,非线性滤波早期运用较多的是中值滤波器,其应用于多维信号处理时,对窄脉冲信号具有良好的抑制能力,但中值滤波器对中拖尾(如均匀分布噪声)和短拖尾分布噪声(如高斯噪声),滤波性能较差,且拖尾越短,其滤波能力越差。

单片机程序中常用滤波算法的时间常数计算

单片机程序中常用滤波算法的时间常数计算

单片机程序中常用滤波算法的时间常数计算滤波算法是常用的信号处理技术,它可以用于去除噪声、平滑信号、提取信号特征等应用场景。

在单片机程序中,常用的滤波算法有移动平均滤波、中值滤波和卡尔曼滤波等。

滤波算法的时间复杂度是衡量算法性能的重要指标之一、在单片机程序中,时间常数是指滤波算法的执行时间,通常以时钟周期来度量。

时钟周期是单片机中基本操作(如加法、乘法、移位等)所需的时钟信号个数。

移动平均滤波是一种简单且常用的滤波算法,它通过计算一定数量的样本的平均值来平滑信号。

移动平均滤波的时间常数取决于所选取的样本数量。

假设移动平均滤波使用N个样本,单片机的时钟频率为f,则移动平均滤波的时间常数可以通过以下公式计算:T_avg = N / f中值滤波是一种非线性滤波算法,它通过求取一组样本的中值来去除噪声。

中值滤波的时间常数取决于所选取的样本数量。

假设中值滤波使用N个样本,单片机的时钟频率为f,则中值滤波的时间常数可以通过以下公式计算:T_med = N / f卡尔曼滤波是一种递归滤波算法,它可以根据系统的动态模型和测量值来估计被测量值的最优估计。

卡尔曼滤波的时间常数取决于计算卡尔曼增益和更新状态的复杂度。

具体的时间常数计算比较复杂,通常需要根据具体实现来评估。

除了滤波算法本身,还需要考虑单片机的处理能力和数据处理规模。

如果样本数量较大,计算量较大,可能会导致滤波算法的执行时间过长,从而影响实时性。

在实际应用中,需要综合考虑滤波效果和系统实时性的平衡。

在单片机程序中,滤波算法的时间常数还会受到代码优化、编译器优化、硬件加速等因素的影响。

通过合理的算法选择和实现优化,可以提高滤波算法的执行效率,减少时间常数,从而提高单片机程序的性能。

总之,滤波算法的时间常数是衡量滤波算法执行效率的重要指标,它可以通过样本数量、时钟频率等因素来计算。

在单片机程序中,需要平衡滤波效果和系统实时性,通过合理的算法选择和实现优化来提高性能。

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

快速中值滤波算法————————————————————————————————作者:————————————————————————————————日期:南昌大学实验报告学生姓名:洪僡婕学号:6100411159 专业班级:数媒111班实验类型:■验证□综合□设计□创新实验日期: 4.29 实验成绩:一、实验项目名称数字图像处理二、实验目的实现快速中值滤波算法三、实验内容用VC++实现中值滤波的快速算法四、主要仪器设备及耗材PC机一台五、实验步骤// ImageProcessingDoc.cpp : implementation of the CImageProcessingDoc class// #include "stdafx.h"#include "ImageProcessing.h"#include "ImageProcessingDoc.h"#include "GreyRatio.h"#include <math.h>#define PI (acos(0.0) * 2)#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CImageProcessingDocIMPLEMENT_DYNCREATE(CImageProcessingDoc, CDocument)BEGIN_MESSAGE_MAP(CImageProcessingDoc, CDocument)//{{AFX_MSG_MAP(CImageProcessingDoc)ON_COMMAND(ID_HISTOGRAM_ADJUSTIFCATION, OnHistogramAdjustifcation)ON_COMMAND(ID_FFT, OnFft)ON_COMMAND(ID_SALT_PEPPER_NOICE, OnSaltPepperNoice)ON_COMMAND(ID_RANDOM_NOISE, OnRandomNoise)ON_COMMAND(ID_MEDIAN_FILTERING, OnMedianFiltering)ON_COMMAND(ID_DCT, OnDct)ON_COMMAND(ID_FWT, OnFwt)ON_COMMAND(ID_DHT, OnDht)ON_COMMAND(ID_WAVELET_TRANSFORM, OnWaveletTransform)ON_COMMAND(ID_GREY_ADJUSTIFCATION, OnGreyAdjustifcation)ON_COMMAND(ID_GREY_LINEAR_ADJUSTIFCATION, OnGreyLinearAdjustifcation)ON_COMMAND(ID_GREY_SEGLINEAR_ADJUSTIFCATION, OnGreySeglinearAdjustifcation) ON_COMMAND(ID_2DGRAD, On2dgrad)ON_COMMAND(ID_ROBERT, OnRobert)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CImageProcessingDoc construction/destructionCImageProcessingDoc::CImageProcessingDoc(){// TODO: add one-time construction code heremImageFile = NULL;bFileIsLoad = FALSE;nRows = 256;nCols = 256;mSourceData = NULL;pSourceData = NULL;bDataIsProcessed = FALSE;mResultData = FALSE;pResultData = FALSE;FourierDataR = NULL;FourierDataI = NULL;}CImageProcessingDoc::~CImageProcessingDoc(){}BOOL CImageProcessingDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: add reinitialization code here// (SDI documents will reuse this document)return TRUE;}///////////////////////////////////////////////////////////////////////////// // CImageProcessingDoc serializationvoid CImageProcessingDoc::Serialize(CArchive& ar) {if (ar.IsStoring()) {// TODO: add storing code here}else{// TODO: add loading code here}}///////////////////////////////////////////////////////////////////////////// // CImageProcessingDoc diagnostics#ifdef _DEBUGvoid CImageProcessingDoc::AssertValid() const{CDocument::AssertValid();}void CImageProcessingDoc::Dump(CDumpContext& dc) const{CDocument::Dump(dc);}#endif //_DEBUG///////////////////////////////////////////////////////////////////////////// // CImageProcessingDoc commandsBOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszPathName) { int x;int y;if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// TODO: Add your specialized creation code hereif(mSourceData) {free(mSourceData);mSourceData = NULL;}if (!(mSourceData = (unsigned char *)malloc(nRows*nCols*sizeof(unsigned char))))return FALSE;if (pSourceData) {free(pSourceData);pSourceData = NULL;}if (!(pSourceData = (unsigned char *)malloc(3*nRows*nCols*sizeof(unsigned char))))return FALSE;if (mResultData) {free(mResultData);mResultData = NULL;}if (!(mResultData = (unsigned char *)malloc(nRows*nCols*sizeof(unsigned char))))return FALSE;if (pResultData) {free(pResultData);pResultData = NULL;}if (!(pResultData = (unsigned char *)malloc(3*nRows*nCols*sizeof(unsignedchar))))return FALSE;if (mImageFile) {fclose(mImageFile);mImageFile = NULL;}if (!(mImageFile = fopen(lpszPathName,"rb"))){free(mSourceData);return FALSE;}if (fread(mSourceData,sizeof(unsigned char),nRows*nCols,mImageFile) != (unsigned)nCols*nRows) {free(mSourceData);fclose(mImageFile);mImageFile = NULL;bFileIsLoad = false;return FALSE;}for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){pSourceData[3*y*nCols+3*x] = mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+1] = mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+2] = mSourceData[y*nCols+x];}bFileIsLoad = TRUE;return TRUE;}void CImageProcessingDoc::OnHistogramAdjustifcation(){// TODO: Add your command handler code hereint x,y;double *mR;double *mS;mR = new double[256];mS = new double[256];for(x=0;x<256;x++){mR[x] = mS[x] = 0.0;}//统计直方图for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){mR[mSourceData[y*nCols+x]] ++;}for(x=0;x<256;x++){for(y=0;y<x;y++)mS[x] += mR[y];mS[x] /= nRows*nCols;}//直方图变换for(y = 0; y < nRows; y++)for(x = 0; x < nCols; x++)mResultData[y*nRows+x] = (char) (255* mS[mSourceData[y*nRows+x]]);//灰度计算for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){pResultData[3*y*nCols+3*x] = mResultData[y*nCols+x];pResultData[3*y*nCols+3*x+1] = mResultData[y*nCols+x];pResultData[3*y*nCols+3*x+2] = mResultData[y*nCols+x];}//更新显示UpdateAllViews(NULL);}// FFTandIFFT 一维傅立叶变换与逆变换函数// 输入时域数据实部Tr,虚部Ti// 输出频域数据实部Tr,虚部Ti// 序列长度N,N等于2的r次幂// FFTorIFFT,逻辑变量,非零做正变换,零做反变换void CImageProcessingDoc::FFTandIFFT(float *Tr, float *Ti, int N, bool FFTorIFFT) {int r; //迭代次数int l,j,k;//循环变量int p; //用于蝶形计算加权系数的指数int B; //对偶结点距离float X,Y,XX,YY;float w;float cosw,sinw;if (!FFTorIFFT) { //如果做傅立叶逆变换,则必须对数列除以Nfor(l=0;l<N;l++){Tr[l] /= N;Ti[l] /= N;}}//计算循环次数rr = 0; l = N;while(l /= 2) r++;//倒序int LH = N/2;int i;float temp;j = 0;for (i=1;i<N-1;i++){k = LH;while(j>=k) {j = j-k;k = k/2;}j = j + k;if (i<=j) {temp = Tr[i]; Tr[i] = Tr[j]; Tr[j] = temp;temp = Ti[i]; Ti[i] = Ti[j]; Ti[j] = temp;}}for(l=0; l <= r; l++) //共r级{B = 1<<(l-1); // 第l层对偶结点距离为2^(l-1)for(j=0; j < B;j++){p = j*(1<<(r-l));w = 2*PI*p/N;for(k=j;k<N-1;k+=(1<<l)) {if (FFTorIFFT) { //若做傅立叶正变换cosw =cos(-w);sinw =sin(-w);}else{ //傅立叶反变换cosw =cos(w);sinw =sin(w);}X = Tr[k] + Tr[k+B]*cosw - Ti[k+B] * sinw;Y = Ti[k] + Tr[k+B]*sinw + Ti[k+B] * cosw; XX = Tr[k] - Tr[k+B]*cosw + Ti[k+B] * sinw;YY = Ti[k] - Tr[k+B]*sinw - Ti[k+B] * cosw;Tr[k] = X;Ti[k] = Y;Tr[k+B] = XX;Ti[k+B] = YY;}}}}void CImageProcessingDoc::OnFft(){// TODO: Add your command handler code hereint i,j;int ii,jj;float temp;float *Tr;float *Ti;Tr = new float[nCols];Ti = new float[nCols];if ( FourierDataR) {delete FourierDataR;FourierDataR = NULL;}if ( FourierDataI) {delete FourierDataI;FourierDataR = NULL;}FourierDataR = new float[nRows*nCols];FourierDataI = new float[nRows*nCols];for(i=0;i<nRows;i++){for(j=0;j<nCols;j++){ //图像数据先给傅立叶变换数组FourierDataR[i*nCols+j] = (float) mSourceData[i*nCols+j];FourierDataI[i*nCols+j] = 0.0;}for (i=0;i<nRows;i++){ //每行进行傅立叶变换for (j=0;j<nCols;j++){Tr[j] = FourierDataR[i*nCols + j];Ti[j] = FourierDataI[i*nCols + j];}FFTandIFFT(Tr,Ti,nCols,1);for (j=0;j<nCols;j++){FourierDataR[i*nCols + j] = Tr[j];FourierDataI[i*nCols + j] = Ti[j];}}delete Tr;delete Ti;Tr = new float[nRows];Ti = new float[nRows];for(j=0;j<nCols;j++){ //每列进行傅立叶变换for (i=0;i<nRows;i++){Tr[i] = FourierDataR[i*nCols + j];Ti[i] = FourierDataI[i*nCols + j];}FFTandIFFT(Tr,Ti,nRows,1);for (i=0;i<nRows;i++){FourierDataR[i*nCols + j] = Tr[i];FourierDataI[i*nCols + j] = Ti[i];}}for (i=0;i<nRows;i++){for (j=0;j<nCols;j++){temp = sqrt(FourierDataR [i*nCols+j]*FourierDataR [i*nCols+j] +FourierDataI [i*nCols+j]*FourierDataI[i*nCols+j] );temp /= 100;if(temp > 255.0)temp = 255.0;ii = nRows - 1 - (i<nRows/2?i+nRows/2:i-nRows/2);jj = (j<nCols/2)?(j+nCols/2):(j-nCols/2);//将变换后现实的原点调整在中心位置pResultData[3*ii*nCols+3*jj] = (int) temp;pResultData[3*ii*nCols+3*jj+1] = (int) temp;pResultData[3*ii*nCols+3*jj+2] = (int) temp;}//更新显示UpdateAllViews(NULL);delete FourierDataR;delete FourierDataI;FourierDataI = NULL;FourierDataR = NULL;return;}void CImageProcessingDoc::OnSaltPepperNoice(){// TODO: Add your command handler code here// TODO: Add your command handler code hereint x;int y;Salt_Pepper_Noise(mSourceData,nCols,nRows);for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){pSourceData[3*y*nCols+3*x] = (unsigned char) mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+1] = (unsigned char) mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+2] = (unsigned char) mSourceData[y*nCols+x];}UpdateAllViews(NULL);}void CImageProcessingDoc::OnRandomNoise(){// TODO: Add your command handler code hereint x;int y;Random_Noise(mSourceData,nRows,nCols);for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){pSourceData[3*y*nCols+3*x] = (unsigned char)mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+1] = (unsigned char)mSourceData[y*nCols+x];pSourceData[3*y*nCols+3*x+2] = (unsigned char)mSourceData[y*nCols+x];}UpdateAllViews(NULL);}void CImageProcessingDoc::Salt_Pepper_Noise(unsigned char *mdata, int nHeight, int nWidth) {unsigned char* lpSrc;//循环变量long i;long j;//生成伪随机种子srand((unsigned)time(NULL));//在图像中加噪for (j = 0;j < nHeight ;j++){for(i = 0;i < nWidth ;i++){if(rand()>31500) {// 指向源图像倒数第j行,第i个象素的指针lpSrc = (unsigned char *)&mdata[j*nWidth + i];//图像中当前点置为黑*lpSrc = 0;}}}// 返回return ;}void CImageProcessingDoc::Random_Noise(unsigned char *mdata, int nHeight, int nWidth) {// 指向源图像的指针unsigned char* lpSrc;//循环变量long i;long j;//像素值unsigned char pixel;//噪声BYTE NoisePoint;//生成伪随机种子srand((unsigned)time(NULL));//在图像中加噪for (j = 0;j < nHeight ;j++){for(i = 0;i < nWidth ;i++){NoisePoint=rand()/1024;// 指向源图像倒数第j行,第i个象素的指针lpSrc = (unsigned char *)&mdata[nWidth * j + i];//取得像素值pixel = (unsigned char)*lpSrc;*lpSrc = (unsigned char)(pixel*224/256 + NoisePoint);}}// 返回return ;}void CImageProcessingDoc::MedianFiltering(unsigned char *sourcedata, unsigned char *resultdata,int nHeight, int nWidth, int nR){int i,j,m,n,r;unsigned tmp;unsigned char* mdata = new unsigned char[(2*nR+1)*(2*nR+1)];for (i=0;i<nRows;i++)for (j=0;j<nCols;j++){if((i<nR) || (i>nHeight-nR-1) || (j<nR) || (j>nWidth-nR-1))resultdata[i*nWidth+j] = 0;else {for(m=-nR;m<=nR;m++)for(n=-nR;n<=nR;n++)mdata[(m+nR)*(2*nR+1)+n+nR] =sourcedata[(i+m)*nWidth+(j+n)]; //排序for(m=0;m<(2*nR+1)*(2*nR+1)-2;m++){r = 1;for (n=m+1;n<(2*nR+1)*(2*nR+1);n++){if (mdata[n]<mdata[n+1]){tmp = mdata[n];mdata[n]=mdata[n+1];mdata[n+1]=tmp;r=0;}}if (r)break;}mResultData[i*nWidth+j] = mdata[nR*(2*nR+1)+nR];}}}void CImageProcessingDoc::OnMedianFiltering() {// TODO: Add your command handler code hereint x;int y;MedianFiltering(mSourceData,mResultData,nRows,nCols,1);for(y = 0; y < nRows; y++){for(x = 0; x < nCols; x++){pResultData[3*y*nCols+3*x] = (unsigned char) mResultData[y*nCols+x];pResultData[3*y*nCols+3*x+1] = (unsigned char) mResultData[y*nCols+x];pResultData[3*y*nCols+3*x+2] = (unsigned char) mResultData[y*nCols+x];}UpdateAllViews(NULL);}void CImageProcessingDoc::OnDct() {// TODO: Add your command handler code here}void CImageProcessingDoc::OnFwt() {// TODO: Add your command handler code here}void CImageProcessingDoc::OnDht() {// TODO: Add your command handler code here}void CImageProcessingDoc::OnWaveletTransform() {// TODO: Add your command handler code here}void CImageProcessingDoc::OnGreyAdjustifcation() {// TODO: Add your command handler code here}void CImageProcessingDoc::OnGreyLinearAdjustifcation() {// TODO: Add your command handler code hereint x;int y;int tmp;CGreyRatio mdlg;mdlg.DoModal();for(y=0;y<nRows;y++)for(x=0;x<nCols;x++){tmp =(int)(mdlg.m_GreyRatio*mSourceData[y*nCols+x]);tmp = tmp>255?255:tmp;pResultData[3*y*nCols+3*x] = tmp;pResultData[3*y*nCols+3*x+1] = tmp;pResultData[3*y*nCols+3*x+2] = tmp;}UpdateAllViews(NULL);}void CImageProcessingDoc::OnGreySeglinearAdjustifcation() {// TODO: Add your command handler code here}void CImageProcessingDoc::On2dgrad() {// TODO: Add your command handler code hereint x;int y;int dx;int dy;int tmp;for(y=0;y<nRows-1;y++){for(x=0;x<nCols-1;x++){dx = mSourceData[y*nCols+x] - mSourceData[y*nCols+x+1];dy = mSourceData[y*nCols+x] - mSourceData[(y+1)*nCols+x];tmp = (int) sqrt(dx*dx+dy*dy);tmp = tmp>255?255:tmp;pResultData[3*y*nCols+3*x] = tmp;pResultData[3*y*nCols+3*x+1] = tmp;pResultData[3*y*nCols+3*x+2] = tmp;}UpdateAllViews(NULL);}void CImageProcessingDoc::OnRobert() {// TODO: Add your command handler code hereint x;int y;int dx;int dy;int tmp;for(y=0;y<nRows-1;y++){for(x=0;x<nCols-1;x++){dx = mSourceData[y*nCols+x] - mSourceData[(y+1)*nCols+x+1];dy = mSourceData[y*nCols+x+1] - mSourceData[(y+1)*nCols+x];tmp = (int) sqrt(dx*dx+dy*dy);tmp = tmp>255?255:tmp;pResultData[3*y*nCols+3*x] = tmp;pResultData[3*y*nCols+3*x+1] = tmp;pResultData[3*y*nCols+3*x+2] = tmp;}UpdateAllViews(NULL);}void CImageProcessingDoc::DCTandIDCT(float *Ff, int N, bool bDctIDct){ float *mR;float *mI;int i;float Ff0 = 0;mR = new float[N*2];mI = new float[N*2];if(bDctIDct){for(i=0;i<2*N;i++){if(i<N)mR[i] = Ff[i];else{mR[i] = 0;mI[i] = 0;}for(i=0;i<N;i++){Ff0 += Ff[i];Ff0 = Ff0/sqrt(N);FFTandIFFT(mR,mI,2*N,true)Ff[0] = Ff0;for(i=0;i<N;i++){Ff[i] = (mR[i]*cos(i*PI/(2*N)) + mI[i]*sin(i*PI/(2*N))) *sqrt(2.0/N);}else{for(i=0;i<2*N;i++){if(i<N){mR[i] = Ff[i]*cos(i*PI/(2*N));mI[i] = Ff[i]*sin(i*PI/(2*N));}else{mR[i] = 0;mI[i] = 0;}}for(i=0;i<N;i++){Ff0 += Ff[i];Ff0 = Ff0/sqrt(N);FFTandIFFT(mR,mI,2*N,false);for(i=0;i<N;i++){Ff[i] = 1/sqrt(N) - sqrt(2.0/N) + sqrt(2.0/N)*mR[i];}return;}六、实验数据七、思考及体会在设计算法编制程序的时候,我们充分考虑到程序运行的时间复杂度和空间复杂度问题,在解决问题的前提下,使算法尽量简单,使程序运行占有的空间尽量的小,这样来减少不必要的时问浪费和空间浪费,从而太大的提高程序执行的效率。

相关文档
最新文档