没有合适的资源?快使用搜索试试~ 我知道了~
快速中值滤波及c语言实现.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 198 浏览量
2022-07-03
01:22:48
上传
评论 1
收藏 144KB DOCX 举报
温馨提示
试读
19页
快速中值滤波及c语言实现
资源推荐
资源详情
资源评论
快速中值滤波及c语言实现
学生姓名: 刘 勇 学 号: 6100410218 专业班级: 数媒101
【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的
过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题.解决了由于图
像太大而内存不够的问题,运用对程序运行时的方法,得出在PENTIUM-S100MHz
上中值滤渡的一般算法运行4.23秒.而快速算法运行2 58秒。
【关键词】c 语言;中值滤波;快速算法
1 引言
中值滤波是涂基发明的一种非线性信号处理技术,对抑制图像的噪声非常
有效,在二维形式下,中值滤渡器是一个古有奇数个像素的滑动窗口,窗口正
中的象素的灰度值用窗口内各个象素的中值代替窗口的中值为窗口中象素按大
小顺序排列后处于中间位置的象素;本文讨论中值滤的一般算法并比较其运算
速度。
2 用C语言实现算法的若干问题
在设计算法编制程序的时候,我们充分考虑到程序运行的时间复杂度和
空间复杂度问题,在解决问
题的前提下,使算法尽量简单,使程序运行占有的空间尽量的小,这样来减少
不必要的时问浪费和空间浪费,从而太大的提高程序执行的效率。
首先考虑到的内存问题。由于在本文算法中用的图像是512+512 8bit,这
就存在一个内存不够大一整幅图像不能一次性调入的问题。为了解受此问题,
可以只开辟一个3"512的缓冲区n,将原图像采用分批调入缓冲区,使内存不够
的问题得到了圆满的解决。
另外为了对中值滤波的快速算法和普通算法进行精确的比较,采用对程序
运行计时的方法,并精确计算每个算法运行的时间,使得出的结论更可靠。
3 中值滤波算法的C语言程序实现
本算法采用对开辟的3*512的缓冲区从左到右依次形成一个3*3的窗口.然后将
此3*3的窗口放
人一个一维数组中,调用求中值子函数.通过排序得出中值,当此中值不等于
窗口中间位置的象素时.用此中值来代替窗VI中间位置的象素灰度值.若此缓
冲区处理完毕后,将缓冲区的第一行存入新建的文件中,将第二、第三行分别
向上移动一行,若存人新建的文件中的行数小于或等于511(即这样处理的行
数小于或等于511),则从原文件中调入一行作为缓冲区第三行,按上述方法进
行直到处理的总行数等于511为止,最后,将缓冲区的第二、三行存人新建的文
件,程序流程框图如图1
4 中值滤波快速算法的C语言程序实现
本算法充分利用了上一次处理的结果.采用迭代,逐次逼近的方法得到本次的
中值,在一行处理完毕后转人下一行也采用走S型的方法.这样除第一个窗口采
用了一伏排序得到中值外,其它的窗口都利
用上伏的窗口的象素删除无用的3个象素后再加人新的3个象素,利用迭代的方
法得到本次窗口的中值.这样太大地提高了程序执行的效率。
4.1算法的解释
首先是开辟一个3*512的缓冲区a,在初始化缓冲区时考虑到时间复杂度的问
题,所以只初始化了第二、三行,而对第一行只初始化了前三个象素,这样便
在缓冲区中可以得到一个3*3的窗口,对此窗口进行排序求中值后得出第一个窗
口的中间象素的值.将文件指针定位在2*512处。然后开始循环,当处理的行数
小于或等于511时,将缓冲区a中的第二、三行分别向上移动一行变为第一、二
行,从文件中读人512个字节作为缓冲区的第三行,并用行数模2的方法设置方
向标志k.当k为0时,从左向右移动窗口.当k为1时.从右向左移动窗口.而每
一窗口都利用上次的窗口的像素删除无用的3个象素后再加入新的3个象素.利
用迭代的方法从上次的中值得到本次的中值。当处理完一行后将缓冲区的第一
行存入新建的文件中,最后将缓冲区的第二、三行存入文件中。
4.2 算法代码
// 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_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////
////////
// CImageProcessingDoc
IMPLEMENT_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_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////
////////
// CImageProcessingDoc construction/destruction
CImageProcessingDoc::CImageProcessingDoc()
{
// TODO: add one-time construction code here
mImageFile = 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 serialization
void CImageProcessingDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////
////////
// CImageProcessingDoc diagnostics
#ifdef _DEBUG
void CImageProcessingDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CImageProcessingDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////
剩余18页未读,继续阅读
资源评论
oligaga
- 粉丝: 50
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功