APP下载

基于MFC的手绘图形实时去噪研究与应用

2017-03-31隋雪洁高林杨伟万国超刘贵彬

软件导刊 2016年8期
关键词:插值

隋雪洁+高林+杨伟+万国超+刘贵彬

摘 要:分析了离散点数据的一般处理方法,针对慢速手绘图形产生的边缘噪点问题,提出一种适用于实时生成图形的预处理算法,对采集的数据点进行实时筛选插值,以保证数据准确可靠。在MFC中进行实现,并将其应用于软件开发,测试表明该算法绘图效果改善极大,慢速手绘图形平滑且不失真。

关键词关键词:离散点;MFC;GDI;插值;边缘噪点

DOIDOI:10.11907/rjdk.161468

中图分类号:TP317.4

文献标识码:A 文章编号:1672-7800(2016)008-0183-03

0 引言

无论是科学研究还是实际生产中,人们通过采集、测量或者实验会获得很多数据,通常情况下,这些数据都是离散的,很难直接从一大堆离散数据中找到它们的内在联系。随着计算机图形学的发展,离散数据的重建与可视化得到越来越广泛的研究与应用,主要是对数据进行插值、拟合形成曲线或曲面,用图形图像的方式表现出来。本文结合实际需求,针对手绘图形实时输出产生的噪点问题,提出一种新的研究方法,对干扰点进行处理,并在MFC中实现。实验证明,该方法能够很好地应用于手绘图形生成中。

1 问题阐述

激光笔打在手绘板上进行绘图,采样画笔的采样频率固定不变,快速书写时点与点之间的間隔大,采集的样点相对精确,所绘出的图像圆滑,可以被视觉所接受。但在实际操作中,手绘迅速程度无法保证,当笔触放慢时,点与点的间隔很小,相同时间段内,采集点的数量增多,若不对采集点进行处理,则导致绘出的图像产生边缘噪点。

2 离散点处理技术

离散点是一些孤立的点集,每个元素之间都有一定的间距,在二维或者三维空间上无规律分布,复杂程度不一[1]。

目前,国内外学者主要用3种技术对离散点进行处理,选择何种方法取决于数据的准确性,用逼近的方法处理带有一定误差的数据;用插值的方法处理非常准确的数据;若部分数据有误差,部分数据准确,则选用拟合的方法。

上述过程将数据分为两部分,在阈值范围以内的不做处理,若将不合阈值的点全部删除,曲线会更加平滑,但直接删除的后果是数据的误差导致图像失真,因此,该部分暂留点进行分析后再加以精确,保证数据的可靠性。

考虑到笔画的趋势问题,将点按照方位进行处理,以本次保留点为原点,下一保留点为终点,两点连线作为参考向量,计算其余点向量与之夹角,夹角越小,与用户绘制图形相关性越大,反之,夹角太大,则极有可能为干扰点。

定义相邻保留点的中点坐标为(x,y),干扰点坐标为(xj,yj),w1=0.5,与参照线直线夹角余弦值为w2,若w2>w1将本部分点再次删减,以距离加权的方式计算其余采集点的估计值remain,插入相应保留点位置。

当前对已有离散点做好预处理,运用GDI的DrawCurve算法,通过一定的张力,将最终保留点连接为基数样条曲线,保证绘制的曲线平滑地经过每一个点,陡度上没有突然的变化和尖角,确保绘制的滑顺性。

4 实现

4.1 平台

采用VS/MFC开发环境,MFC是VC++ 的核心,彻底封装Windows应用程序开发包的功能和结构,提供一个应用程序框架,并继承C++绘图方面的优点,结合图形设备接口GDI,处理所有Windows程序的图形输出。MFC提供了两种重要的类以支持GDI绘图,一是用于设置绘图属性和绘制图形的设备环境DC类,二是各种GDI绘图对象的绘图对象类[2]。

4.2 双缓冲机制

Windows需要重画窗口时,会向窗口发出一个消息函数,应用程序将在消息响应函数中重绘,导致屏幕不停闪烁,绘图效率低,CPU占用率高,还有可能导致程序崩溃[3]。因此对于本次复杂绘图,采用后缓冲区的方式,将窗口内容拷贝到dc中,要显示的函数先绘制在内存虚拟dc上。为方便调用,dc作为一个全局的变量存在,当所有操作完成后,再将内容复制到屏幕,实质上只是在OnPaint里贴图,解决屏幕闪烁问题。

主要实现代码如下:

CPaintDC dc(this);CRect rect;GetClientRect(&rect); //获取对话框长宽CDC dcBmp; //定义并创建一个内存设备环境 CBitmap MemBitmap; //定义一个位图对象dcBmp.CreateCompatibleDC(&dc);//创建兼容性DC MemBitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//建立一个与屏幕显示兼容的位图,将位图选入临时内存设备环境

4.3 数据

采集的离散点数据保存在bin文件中,每个点分别由X坐标、Y坐标、笔画计数组成,其中笔画用来判断两点是否相连,采集数据部分点的存储信息如图1所示。

定义点的结构体:

typedef struct Po_s{ unsigned int x; 横坐标值 unsigned int y; 纵坐标值 unsigned int down; 笔尖抬起与否的标志}Po

4.4 其它参数说明

其它参数说明如表1所示。

4.5 绘图过程

绘制过程分为画笔连续和画笔抬起两种情况,分别做不同处理。画笔抬起时,调用DrawCurve算法绘图,连接静态数组point中已存点,将扫描点存入静态数组point[0],同时将计数器n重置为1,间隔k置为1,最后清空静态数组point。画笔连续时,过程相对复杂,处理如下:

(1)扫描点间距小于阈值。①将该点删除,暂时加入动态数组pt,间隔k加1;②若该扫描点为最后一点,调用DrawCurve算法绘图,连接静态数组point中已存点,将计数器n重置为0;否则,退出。

(2)扫描点间距大于等于阈值。①若删除点数量num超过或等于12个(经反复试验的最优临界值):将动态数组pt中的点取出,按算法求取估计点,加入静态数组point; 将计数器n加1,num置为0,间隔k置为1。若计数器n等于5,绘图,并将均值点存入point[0],将计数器n置为1,否则退出;若删除点数量num小于7个,直接退出;②将扫描点存入静态数组point,计数器n加1,间隔k置为1,动态数组pt清空;③若计数器n等于5,绘图,将扫描点存入point[0],计数器置为1,间隔k置为1,动态数组pt清空;否则(计数器n<5),若该扫描点为最后一点,调用DrawCurve算法绘图,连接靜态数组point中已存点,将计数器n重置为0;④否则,进行下一次点的循环扫描。

5 测试

将实现的算法应用于慢速绘图,用几种不同笔触走向的图形进行测试,与未处理图像比较,边缘噪点去除效果显著且不失真。曲线、直线、汉字的测试结果对比分别如图2~图4所示,可见优化后的图像比优化前更加平滑。

6 结语

本文将一般离散点处理方式与实际问题相结合,针对实时生成的图形,研究一种新型离散点的预处理方法,拓宽了直接曲线拟合方式的适用空间。在MFC中加以实现,并运用到软件开发中,对不同类型的笔画进行反复测试,达到了理想效果,笔画连接更加正确、顺畅。

参考文献:

[1]蔡德福,石东源,李高望,等.基于输入随机变量离散数据的概率潮流计算方法[J].电网技术,2013(9):2475-2479.

[2]黄琛.基于MFC的绘图软件设计与实现[J].电脑知识与技术,2013(10):2345-2348.

[3]江建国,温少营,张瑞楠.基于双缓冲技术的GDI+无闪烁绘图[J].计算机应用,2012(12):137-139.

[4]苏江宽,基于B样条的图像插值算法研究[D].广州:广东工业大学,2014(6):12-16.

[5]顾天奇,张雷,冀世军,等.封闭离散点的曲线拟合方法[J].吉林大学学报,2015(3):438-441.

[6]谢裕敏,舒辉,陈建敏,等.MFC消息响应函数的逆向定位[J].计算机应用,2009(5):1394-1396.

[7]蔡山,张浩,陈洪辉,等.基于最小二乘法的分段三次曲线拟合方法研究[J].科学技术与工程,2007(2):353-355.

[8]MU GUOWANG,DAI SHIJIE.Reconstruction of B-spline surface by interpolating boundary curves and approximating inner points[J].Computer Aided Drafting,Design and Manufacturing,2012(3):32-34.

(责任编辑:孙 娟)

猜你喜欢

插值
基于Padé-type逼近的复合重心有理插值
构造给定极点的有理插值新方法
基于Sinc插值与相关谱的纵横波速度比扫描方法
混合重叠网格插值方法的改进及应用
一种改进FFT多谱线插值谐波分析方法
基于四项最低旁瓣Nuttall窗的插值FFT谐波分析
双正交周期插值小波函数的实值对称性
基于加窗插值FFT的PMU校验方法
关于埃尔米特插值的教学探讨
二元复合重心有理插值