Posted on 2006-11-30 15:01
济公 阅读(2402)
评论(1) 编辑 收藏 引用 所属分类:
VCMatlab
1 前言
SAR是通过信号处理技术对地面进行高分辨率成像的一种新体制雷达,SAR图像在对地遥感、军事目标识别、跟踪、打击等领域取得了非常广泛的应用,为了进一步促进SAR图像的应用研究,需要对其进行定量评估,在对SAR成像研究的基础上开发了基于VC++与MATLAB混合编程技术的SAR图像处理与质量评估系统软件。文章主要介绍了利用MATCOM 进行VC++和MATLAB混合编程的步骤与优点,和SAR图像处理与质量评估软件系统的实现。系统利用MATLAB的图像处理函数、开放式接口和VC++的可视化界面等强大功能,集成了SAR图像处理与质量评估中所需的主要功能。
2 MATCOM与混合编程
MATLAB其强大的数据处理能力和丰富的工具箱,使得它的编程较为简单,可以极大地缩短应用程序开发
周期,提高编程效率和缩短理论方案研制周期。对于纯理论方案来说,MATLAB语言的优势较多。其在图像处理方面更有着明显的优势:
(1)它具有强大的矩阵运算功能,在进行一些简单的图像变换时可以避免很多烦琐的运算;
(2)图形显示方便,有专门的灰度及彩色图像显示函数,甚至在调试过程中也能随时观察图形的变化;
(3)带有丰富的图像处理函数库,如wavelettoolbox,imageprocessingbox。
VisualC++是Windows下的主要编程语言之一,它能方便地形成应用软件中所需的各种用户界面和工具,
并直接与系统及底层硬件交换数据。用VC++开发的系统具有容易维护升级、界面友好、代码效率高、执行速度快等一系列优点。因此VC++已成为目前应用软件开发中广泛采用的主要工具之一。如上所述,MATLAB的优点在于图像处理方面,而VC++的优点在于可视化界面的编程。由于VC++与MATLAB的各自特点,因此在Windows环境下实现两者的混合编程将是一种极为强大的编程手段,它将更加有效地发挥VC++与MATLAB各自的优点。
由于要在VC++环境中调用MATLAB的图形工具箱函数,所以只有采用MATCOM。MathTools公司推出的MATCOM是第一个将MATLAB的M文件转化到C++源程序的变换工具。既保持了MATLAB的优良算法,
又保持了C++的高执行效率。在运用MATCOM之前,首先应设置MATCOM对应的编译器类型,在安装过程中系统会让用户指定所使用的编译器类型和版本。现在最新的版本是Matcom4.5。MATCOM软件平台本身的功能相当强大,通过必要的设置,就可以直接实现与VC++的混合编程,通过把M文件转化为cpp和h文件,从而可以实现脱离MATLAB环境对MATLAB函数和过程的有效调用,这样就有可能实现对MATLAB强大工具箱函数的利用。要实现VC++与MATLAB混合编程,需解决好两方面的内容:一个是接口问题,包括VC++语言程序对MATLAB函数的调用和对准备好的数据的互传;二是数据的组织问题。利用MATCOM 实现VC++与MATLAB混合编程,在Windows下开发了图像处理与质量评估系统。混合编程技术体现了比较好的应用价值。
3 接口的实现步骤
以我们自己编写的一个knn.m图像滤波器函数为例,编程环境为VC+ +6.0,MATLAB6.1,MATCOM4.5。主要步骤如下:
(1)在VC++中创建基于视图类的项目工程zzz。
(2)运行MATCOM的MIDEVA,在主界面上打开要编译的文件knn.m。在弹出的程序界面窗口中选File/
Compiletodll,在编辑框中输入要转化成的cpp文件的名字(此处输入knn)。注意观察MIDEVA主界面右下窗口的信息,当没有报错信息后,在matcom45∖samples∖Debug里就生成了我们需要的knn.cpp与knn.h。
(3)将knn.cpp与knn.h拷贝到事先写好的VC++工程目录中,并在Project/Addtoproject/Files中添加它们和v4501v.lib(在matcom45∖lib里)。在knn.cpp头部加上“stdafx.h”。
(4)加连接库:在Tools∖Option∖Directory∖的Includefiles和Libraryfiles选项中,都加入matcom45∖lib(包含matlib.h)。在Project/Setting/C&C++/Preprocessor/Additionalincludedirectory/下添加库文件路径matcom45∖lib。
(5) 在VC++主函数文件zzzView.cpp头添加“matlib.h”和“knn.h”。由于由MATCOM 转化成的cpp文件中的的数据类型全部为Mm类数据类型,因此要将他们进行与C变量的数据转化,具体代码如下:
voidCZzzView::Onfilt()//实现knn滤波的函数
{
LPBYTExxEm-dibFile.m-lpImage;//待处理图像像素数组首地址
CSizesizeFileDibEm-dibFile.GetDimensions();//像素矩阵的大小
MmxEzeros(sizeFileDib.cx,sizeFileDib.cy);//定义一个Mm类的数组变量x,用于存放原图像
MmoutEzeros(sizeFileDib.cx,sizeFileDib.cy);
// 定义一个Mm类的数组变量out,用于存放处理后的图像
for(intiE1;i<EsizeFileDib.cx;i++)
for(intjE1;j<EsizeFileDib.cy;j++){
x.r(i,j)E(xx[(i-1)*sizeFileDib.cy+(j-1)])/
255.0;//把原图像素值赋给x
}
outEknn(x)*255;//调用knn函数,输入和输出参数都是Mm类型
m-dibfilt.AttachMemory(m-dibFile.m-lpBMIH);//获取图像头信息
outputE(unsignedchar*)newchar[sizeFileDib.cx*sizeFileDib.
cy];//为输出图像分配C变量内存空间
for(intiiE1;ii<EsizeFileDib.cx;ii++)
for(intjjE1;jj<EsizeFileDib.cy;jj++)
output[(ii-1)*sizeFileDib.cy+(jj-1)]Eout.r(ii,
jj);//将Mm类型数据传给C变量
m-dibfilt.m-lpImageEoutput;//获取处理后图像的地址
Invalidate();//显示图像
}
将project编译运行,就实现了VC++与MATLAB的混合编程。此方法比较简单可行,而且运行时间比在
MATLAB里运行M文件的时间明显减少。注意:如果要转化的M 文件中调用了其他的M 文件,则把要转化的M文件拷贝到要调用的M文件所在目录进行转化(例如要用到图像处理工具箱里的函数,就拷贝到matlab6p1∖toolbox∖images∖images里)。并且要把生成的相应的所有cpp和h文件添加到工程中。并在相
应的cpp文件头添加相应的h头文件和stdafx.h文件。