当前位置:文档之家› Matlab与C++接口与混合编程讨论小结

Matlab与C++接口与混合编程讨论小结

Matlab与C++接口与混合编程讨论小结
Matlab与C++接口与混合编程讨论小结

Matlab与C++接口与混合编程讨论小结

目录

第一章、概述

第二章、在Matlab中使用mex和mcc(作者dodoo,energy)

2.1 用c编写mex程序[1]--dodoo

2.2 用c编写mex程序[2]--dodoo

2.3 用c编写mex程序[3]--dodoo

2.4 用c编写mex程序[4]--dodoo

2.5 用c编写mex程序[5]--dodoo

2.6 用c编写mex程序[6]--dodoo

2.7 VC++中使用MATLAB的C++数学库和MCC生成的程序--energy

第三章、Matcom的使用

3.1 概述

3.1.1 Matcom能作什么

3.1.2 Matcom的工作原理

3.1.3 Matcom的不足

3.1.4 Matcom下载地址及网络资源

3.2 版本及安装注意事项

3.2.1 MIDEVA

4.0 的安装

3.2.2 MIDEVA

4.5 的安装

3.3 用Matcom翻译m文件

3.4 如何得到CPP源文件

3.5 在CB中C++与Matlab语言混编

3.6 程序的发布

附录一、Matcom的函数分类列表

--

第一章、概述

Matlab是当今世界上使用最为广泛的数学软件,它具有相当强大的数值计算、

数据处理、系统分析、图形显示,甚至符号运算功能,是一个完整的数学平

台,在这个平台上,你只需寥寥数语就可以完成十分复杂的功能,大大提高了

工程分析计算的效率。另外由于Matlab的广泛使用,于是出现了为各个领域专

门使用的工具箱(即在某一研究领域常用数学工具的函数包),这些工具箱的出现

更加促进了Matlab的流行。

Matlab强大的功能只能在它所提供的平台上才能使用,也就是说,你必需在

安装有matlab系统的机器上使用.m文件,这样就给工程计算带来了很大不便;特别是,在matlab中,使用的行解释方式执行代码,这样大大地限制了代码执行速度。于是人们想到,能否开发一个matlab与其他高级语言的接口,这样就可以把matlab 的强大功能融入各种应用程序中,并且通过高级语言编译器编译为2进制代码,

从而大大提高了执行速度。

于是matlab的5.1版本提供了自带的C++ Complier,同时MathTools公司也为

Matlab开发了m文件高效解释和调试IDE:MIDEVA。经过近两年的发展,matlab

5.3

中的C complier--mcc版本已经为2.0,而MIDEVA最新版本为4.5。

将matlab与C混合编程大概有如下三种方法:

1.用Matlab的mcc将.m文件翻译为cpp源文件,然后在C编译器中调用

也可以用mcc编译编译为stand-alone程序。

2.用Matcom(MIDEVA)将.m文件翻译为cpp代码,并编译为exe或dll

文件。

3.按照matcom的语法,在VC或BCB中直接书写matlab语句(与matlab 很相似),这也是我最喜欢用的方法。

方法1和2/3各有利弊,1不支持图形(支持图形的库国内现在还没有D),

1对类支持也不够,2支持绝大多数的matlab语句(包括图形),但对

于struct等的支持也有缺陷。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(二)

VC++中使用MATLAB的C++数学库和MCC生成的程序

0、简介

MATLAB5.3的提供了C/C++数学库,其中的C++数学库功能很强,使用它可以用类似MATLAB

的语法编写C++程序,十分方便。虽然速度上仍然比手工C/C++程序慢,但是由此换来的高

效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或CPP 文件,编译

后可以脱离MATLAB运行,它们也是使用的C/C++数学库。

不过,MATLAB的数学库在开发时似乎倾向于编译独立的可执行程序,把VC、BC 只是作为一

个编译和连接的工具,而没有过多地考虑在VC、BC的集成环境下进行开发。这给我们带来

了不便。

很多网友问起如何将MCC生成的C++程序嵌入到VC。最近对这个问题做了一下尝试,在这里

做一个总结,请大家回去试试。这里只介绍VC的情况,用BC的网友就自己研究研究吧,估

计是类似的。

1、设置项目编译选项

首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:

Project->Settings->C/C++

Category:Preprocessor

Preprocessor definitions:

添加: MSVC,IBMPC,ND

Category: Precompiled Headers

选择: Automatic use of precompiled headers

Through header: stdafx.h

2、调设置项目连接选项

首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib) libmmfile.def

libmcc.def

libmatlb.def

libmx.def

libmat.def

它们位于目录c:\\matlab\\extern\\include

用下面命令导出库文件:

lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86

lib /def:libmcc.def /out:libmcc.lib /machine:ix86

lib /def:libmatlb.def /out:libmatlb.lib /machine:ix86

lib /def:libmx.def /out:libmx.lib /machine:ix86

lib /def:libmat.def /out:libmat.lib /machine:ix86

将它们放入你的项目连接选项

Project->Settings->Link

Category:Input

Object/library modules:

添加:libmatpm.lib libmmfile.lib libmcc.lib libmatlb.lib libmx.lib libmat.lib

注1: 中间是空格,不要加逗号

注2: libmatpm.lib是C++ MathLib的库,如果是只用C,就不用连接它了。Ignore libraries:

添加: msvcrt.lib

注: 仅在Debug版本中需要。原因不明:P

以上的这些lib文件,我已经做好了,打了个包放在这里下载:matlablibs.zip (64K)

3、设置编译环境

Tools->Options->Directories

Include fiels添加:

c:\\matlab\\extern\\include

c:\\matlab\\extern\\include\\cpp

Library fiels添加:

c:\\matlab\\extern\\lib

c:\\matlab\\extern\\include

注:下面这个目录是那些lib所在的地方。

如果都挪到上面的目录,这个自然就不要了。

4、编写程序

用MCC命令生成的CPP文件和自己手工编写的CPP文件, 其项目设置是完全相同的,

程序的语法原则上也是一样的. 只是MCC生成的CPP文件有大量"没用"的代码. (1)添加自己编写的程序模块

用下面文件头:

#include "stdafx.h"

#include "matlab.hpp"

然后, 按照C++ MathLib文档要求的格式书写程序.

(2)嵌入mcc生成的文件

在MATLAB下用下面格式的命令生成cpp文件

mcc -t -L Cpp test

得到test.hpp, test.cpp

将test.cpp加入项目, 不做任何改动.

最后,摁F7编译就可以了。

5、实例

上面罗罗嗦嗦一大堆,肯定让你打哈欠了:P

没关系,其实还是挺简单的,这里有个VC的project,用C++数学库解决了一个幼儿园的算

术题,下载回去看看吧,马上就明白了。

MccDemo.zip (68K)

这里先说明一下:

MATLAB程序test.m:

function [sum, prod =test(x,y)

sum = x+y;

prod = x*y;

用来计算两个数的和与积。注意这是两个返回变量的情况。

另外,x,y当然可以是数组。

用mcc命令生成了test.hpp和test.cpp。

文件demo.cpp:

#include "stdafx.h"

#include "matlab.hpp"

#include "test.hpp"

void mccDemo()

{ CString str;

mwArray x, y, sum, prod;

double dx,dy,dsum,dprod;

x = 5.0;

y = 10.0;

sum = test(&prod, x, y);

dx=x(1,1);

dy=y(1,1);

dsum=sum(1,1);

dprod=prod(1,1);

str.Format("%f+%f=%f\\n%f*%f=%f",

dx,dy,dsum,dx,dy,dprod);

AfxMessageBox(str);

}

由于采用了C++数学库,语法很简单。注意数组的赋值、其中数据的存取,这些都要仔细

地看手册。

最后是跳出一个消息框,显示计算结果。

改程序启动之后,选择菜单mcc->demo即可。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(三)

第二章、

第一节、用c编写mex程序[开篇]

用C编写mex程序

大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读

一句执行一句的。这样做可以很方便的实现编程过程中的交互,也免去了麻烦又耗时的

编译过程。但凡事有一利必有一弊,matlab在执行时速度慢也就根源于此。在matlab里

tic

for i=1:10000

b(i)=a(10001-i);

end

怎么样,是不是很慢?

你的程序里如果再多几个这样的循环,运行速度就可想而知了。

上面程序的功能是将向量a里的数据逆序赋给向量b。下面的程序可以实现相同的功能

tic

b=a(10000:-1:1);

为什么这个程序运行速度就这么快呢?这是因为matlab里的基础矩阵运算函数,像转

置,复制等等,都是以二进制程序的形式存在的,运行起来速度当然比解释执行10000次

所以编matlab程序时,应该尽量避免用循环语句,而使用等效的矩阵运算。虽然这样

但总是有的时候没法找到对应的矩阵运算来等效,或编出来的程序复杂得让人没法修简单地说,mex程序就是根据一定的接口规范(mtlab提出的)编写的一个dll,matla

比如我编了一个mex函数,名字叫max2.dll,那么只要把这个dll所在的目录加到matlab

的搜索路径里(用addpath),就可以像调用普通matlab函数一样来调用它了。因为把

循环体放到了二进制程序中,执行速度快得多。

Mex文件既可以用c,也可以用fortran来编。因为我用的是c语言,所以下面的介绍都

是用c语言编写mex文件的方法。如果你用的是fortran,请你自己去看Apiguide.pdf,里

面有详细说明。

[开场说明]

我的论文里的程序大多是用matlab编的,因为方向是图像处理,速度上的限制很大。不得已,拿着apiguide.pdf啃了两天,才算摸出点门道。现在论文写完了,想着这点经

验也许有用,就不浅薄,打算把它写下来。因为还要备论文讲稿,还有一堆表要填,不知能否写完,在这里预为说明,到时莫要骂我。^:^

文讲稿,还有一堆表要填

,不知能否写完,在这里预为说明,到时莫要骂我。^:^

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(四)

第二章、

第二节、用c编写mex程序[一]

标题: 用C编写mex程序[PART 2]

前面说到通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。这

Matlab5.1本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC 或Wat

com C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用

mex命令来编译c语言的程序了。如果当时没有选,只要在Matlab里键入mex -setup

,就会出现一个DOS方式窗口,下面只要根据提示一步步设置就可以了。由于我用的是w

听说Matlab5.2已经内置了C语言的编译器,那么下面的这些可能就用不着了。可惜现

需要注意的是,在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的V

C5装在路径C:\\PROGRAM FILES\\DEVSTUDIO下,那在设置路径时就要写成:C:\\PROGRA~1

这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序

存为hello.c。

存为hello.c。

存为hello.c。

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

mexPrintf("hello,world!\\n");

}

假设你把hello.c放在了C:\\TEST\\下,在Matlab里用CD C:\\TEST\\ 将当前目录改为C:\\

TEST\\(注意,仅将C:\\TEST\\加入搜索路径是没有用的)。现在敲:

mex hello.c

如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:\\TEST\\加

入了搜索路径,现在键入hello,程序会在屏幕上打出一行:

hello,world!

看看C\\TEST\\目录下,你会发现多了一个文件:HELLO.DLL。

这样,第一个mex函数就算完成了。怎么样,很简单吧。下一次,会对这个最简单的程

序进行分析,并给它增加一些功能。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(五)

第二章、

第三节、用c编写mex程序[三]

标题: 用C编写mex程序[PART 3]

分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程mexFunction构成。前面提到过,Matlab的mex函数有一定的接口规范,就是指这

nlhs:输出参数数目

plhs:指向输出参数的指针

nrhs:输入参数数目

例如,使用[a,b =test(c,d,e) 调用mex函数test时,传给test的这四个参数分别是2,

plhs,3,prhs。其中:

prhs[0]=c

prhs[1]=d

prhs[2]=e

prhs[2]=e

prhs[2]=e

当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的目

的。

细心的你也许已经注意到,prhs[i]和plhs[i]都是指向类型mxArray类型数据的指针。

这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型

存在。当

然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。

为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输

入参数的变化给出不同的屏幕输出:

//hello.c 2.0

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

int i;

i=mxGetScalar(prhs[0]);

if(i==1)

mexPrintf("hello,world!\\n");

else

mexPrintf("大家好!\\n");

}

}

将这个程序编译通过后,执行hello(1),屏幕上会打出:

hello,world!

而hello(0)将会得到:

大家好!

现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除了用

到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一

个函数:mxGetScalar,调用方式如下:

i=mxGetScalar(prhs[0]);

"Scalar"就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的

作用就是把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里

的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序:

//hello.c 2.1

//hello.c 2.1

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

int *i;

i=mxGetPr(prhs[0]);

if(i[0]==1)

mexPrintf("hello,world!\\n");

else

mexPrintf("大家好!\\n");

}

这样,就通过mxGetPr函数从指向mxArray类型数据的prhs[0]获得了指向double类型的

指针。

但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就

没法对它进行计算。

为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行数

和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来:

//show.c 1.0

#include "mex.h"

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

double *data;

int M,N;

int i,j;

data=mxGetPr(prhs[0]); //获得指向矩阵的指针

M=mxGetM(prhs[0]); //获得矩阵的行数

N=mxGetN(prhs[0]); //获得矩阵的列数

for(i=0;i

{

for(j=0;j

mexPrintf("%4.3f ",data[j*M+i]);

mexPrintf("\\n");

}

}

}

编译完成后,用下面的命令测试一下:

a=1:10;

b=[a;a+1];

show(a)

show(b)

需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数

为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组大data后对应于data[j*M+i] 。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(六)

第二章、

第四节、用c编写mex程序[四]

标题: 用C编写mex程序[PART 4]

输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同

一个地址空间,因而在prhs[]里传递指针就可以达到参数传递的目的。但是,输出参数

却需要在mex函数内申请到内存空间,才能将指针放在plhs[]中传递出去。由于返回指针

类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内

存的申请,函数原型如下:

mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag)

m:待申请矩阵的行数

n:待申请矩阵的列数

为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs[]里传递回去了。但

是对这个新矩阵的处理,却要在函数内完成,这时就需要用到前面介绍的mxGetPr。使用

mxGetPr获得指向这个矩阵中数据区的指针(double类型)后,就可以对这个矩阵进行各

种操作和运算了。下面的程序是在上面的show.c的基础上稍作改变得到的,功能是将输

//reverse.c 1.0

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

double *inData;

double *outData;

int M,N;

int i,j;

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;i for(j=0;j xREAL);

outData=mxGetPr(plhs[0]);

for(i=0;i for(j=0;j outData[j*M+i =inData[(N-1-j)*M+i];

}

当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩

阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到

的一些函数,其余的详细情况清参考Apiref.pdf。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(七)

第二章、

第五节、用c编写mex程序[五]

标题: 用C编写mex程序[PART 5]

通过前面两部分的介绍,大家对参数的输入和输出方法应该有了基本的了解。具备了这

些知识,就能够满足一般的编程需要了。但这些程序还有些小的缺陷,以前面介绍的re

由于前面的例程中没有对输入、输出参数的数目及类型进行检查,导致程序的容错性很

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

double *inData;

double *outData;

int M,N;

int M,N;

//异常处理

//异常处理

if(nrhs!=1)

mexErrMsgTxt("USAGE: b=reverse(a)\\n");

if(!mxIsDouble(prhs[0]))

mexErrMsgTxt("the Input Matrix must be double!\\n");

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;i for(i=0;i

for(j=0;j

outData[j*M+i =inData[(N-1-j)*M+i];

}

在上面的异常处理中,使用了两个新的函数:mexErrMsgTxt和mxIsDouble。MexErrMsgT

xt在给出出错提示的同时退出当前程序的运行。MxIsDouble则用于判断mxArray中的数据

是否double类型。当然Matlab还提供了许多用于判断其他数据类型的函数,这里不加详

述。

需要说明的是,Matlab提供的API中,函数前缀有mex-和mx-两种。带mx-前缀的大多是对

mxArray数据进行操作的函数,如mxIsDouble,mxCreateDoubleMatrix等等。而带mx前缀

的则大多是与Matlab环境进行交互的函数,如mexPrintf,mxErrMsgTxt等等。了解了这

一点,对在Apiref.pdf中查找所需的函数很有帮助。

至此为止,使用C编写mex函数的基本过程已经介绍完了。下面会在介绍几个非常有用的

函数调用。如果有足够的时间,也许还会有一个更复杂一些的例程。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(八)

第二章、

第六节、用c编写mex程序[六]

标题: 用C编写mex程序[PART 6]

我们之所以使用Matlab,很重要的考虑是Matlab提供了相当丰富的矩阵运算函数和各

种toolbox。在编制mex函数时,有时我们也会遇到一些操作,在Matlab下,只需要一个

为了在mex函数里调用Matlab命令,我们就需要用到一个函数mexCallMATLAB,原型如下:

int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[],

const char *command_name);

有了前面的基础,使用这个函数就显得十分容易了。下面给出一个例程,功能是将输入

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

{

{

double *inData;

mxArray *IN[1];

mxArray *OUT[1];

double *outData;

int M,N;

int i,j;

//异常处理

if(nrhs!=1)

mexErrMsgTxt("USAGE: b=rot(a)\\n");

if(!mxIsDouble(prhs[0]))

mexErrMsgTxt("the Input Matrix must be double!\\n");

//计算转置

if(mexCallMATLAB(1,OUT,1,prhs,"\'"))

mexErrMsgTxt("Error when compute!\\n");

//根据输入参数数目决定是否显示

if(nlhs==0)

mexCallMATLAB(0,IN,1,OUT,"disp");

else

plhs[0]=OUT[0];

}

关于这个例子,相信大家一看就明白,我就不多说了。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(九)

第三章、Matcom的使用

3.1 概述

3.1.1 Matcom能作什么

Matcom是一个十分有用的.m文件翻译器(Replacement),它的主要优点我认为有

以下几点:

1>它提供了matlab中.m文件与其他高级语言的接口,使.m文件可以编译为脱离matlab环境独立执行的可执行性程序,这样

。提高了代码的复用率

。提高了代码的执行速度

。使纯文本的.m文件变为二进制的可执行程序,增加了知识保护的安全性

2>它提供了近千个数学函数,对于其他高级语言编译器来说,提供了一个丰富

的数学库,基本上在matlab上能用的常用函数都可以在高级语言中直接调用。

数学函数主要包括:

。矩阵属性函数

。矩阵生成函数

。矩阵生成函数

。矩阵操作函数

。矩阵变换函数

。数学函数

。特殊函数

。数值函数

。串函数

。绘图函数

。颜色函数

。函数函数

。存盘及读文件

。系统资源函数

。系统操作函数

。判断函数(Is函数族)

。付氏变换

等等,可参见本文附录

3>提供了.m文件的方便快捷的编译调适环境,可以step, watch,breakpoint 等各种

调试手段。

3.1.2 Matcom的工作原理

Matcom的矩阵运算部分是基于一个名为Matrix的C++数学库,这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在Matcom中是以lib目录下的*.lib以及windows/system/对应名称的dll文件提供的。

Matcom的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件Teechart来

实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。在Matcom4.5版本中使用的是TeeChart3.0。绘图函数功能主要在lib文件和window/system/ago*.dll中定义的。

Matcom编译.m文件是先将.m文件按照与matcom的Cpp库的对应关系,翻译为CPP源代码,

然后用对应版本的C编译器将该CPP文件编译为exe或dll文件,所以,在第一次运行时

让指定C Complier的路径是必需的,否则将无法编译。指定好的C Complier的

信息写在

Matcom/bin/matcom.ini文件中。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(十)

3.1.3 Matcom的不足

Matcom并不是全能的,对于大多数Matlab函数都可以进行CPP实现,但有些由于其功能

有限,只能期待以后的版本来不断补充了。

总的来说,matcom有以下缺欠:

1.对class数据类型部分支持

2.eval,feval,clear等语句不能在C中实现(如果实现的话,一个文本编辑器就可以成为一个matlab了:))

3.图形窗口有些不仅如人意,如fill3,hide等语句无法实现,surf等语句也无法画出象

matlab中哪样精细的图像来,特别是色彩比较难看:(

等等

3.1.4 Matcom下载地址及网络资源

下载地址是版上询问最多的问题,再次建议大家能到教育网的搜索引擎

https://www.doczj.com/doc/1e5404996.html,:8000/

https://www.doczj.com/doc/1e5404996.html,

https://www.doczj.com/doc/1e5404996.html,/search.php

搜索关键字matcom或MIDEVA,可以查找教育网上的最新的matcom资源Matcom的开发者Mathtools公司地址是

https://www.doczj.com/doc/1e5404996.html,/上面也提供了免费下载服务(他们还会给你一个evaluation key),如果你从哪里下载,他们会给你定期发email告诉最新

的动态。

大家可以定期到公司主页看看有没有版本更新

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(十一)

3.2 版本及安装注意事项

3.2.1 Matcom

4.0 的安装

由于matcom4.0所代的dll文件相对较小,所以便于发布小型程序,所以这里也对它作一

定讨论。

matcom4.0在第一次使用时需要你输入口令,否则无法运行,不过网上已经有matcom4

的注册机,可以查找一个叫regmat4.exe的小程序,输入你想使用的时间区间,然后

就会产生一个合法口令,输入这个口令后,mideva在window目录建立一个名字叫mt_eva

l.txt的

文本文件,里面就保存了你输入的口令,不过你也可以在执行matcom之前直接建立这个

文件,

在里面写1/1/1999-1/1/2010-64562264就可使用到2010年。

通过了口令后,它还有一些限制,如绘图时间不超过60分钟限制,绘图时出现版权对话

等,不过这些已经被energy等诸位大虾给破解了具体如下

energy:

使用PLOT功能时会出现一个对话框,可以这样去掉:

C:\\Windows\\system\\ago.dll

FIND: 83 C4 08 85 C0 75 05

REP : -- -- -- -- -- EB --

如果还想去掉figure标题栏上的[Evaluation software]:

FIND: 43 61 70 74 75 72 65 00 20 5B

REP : -- -- -- -- -- -- -- -- -- 00

huangfh (hoho)对60分钟时间的破解, 就比较完整了:

FIND : 2B D1 81 FA 10 0E 00 00 7E 10

REP : -- -- -- -- -- -- -- -- EB --

3.2.2 Matcom

4.5 的安装

感谢energy的破解,Matcom4.5的口令为FREE-4.5-1193046-80295111 matcom4.5在安装时需要你输入口令,mideva在window的注册表中

HKEY_CURRENT_USER\\Software\\MathTools\\Matcom\\4.50\\ License\\

下面添加一个键,键名默认,键值为FREE-4.5-1193046-80295111

你如果删除它,再次启动matcom的时候,就会再次询问口令。

不过好在如果通过这个口令之后,程序发布时就不再有限制了,也

就是在这个注册后的系统中编译的程序,发布时就不用代一个注册文件了

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(十二)

3.3 用Matcom翻译m文件

直接调适M文件:在主界面上打开.m文件的主文件,在菜单中选择compile to exe or dll 就可以了,你也可以设置断点后,就可以查看变量的值,这些将在主窗口

的一侧出现,双击就可得到其当前值。

编译后的cpp、exe、dll文件都在matcom 当前工作目录下,如果是debug模式,就在

dubug目录下找,否则就在Release目录下找。

3.4 在C++Builder 3.0中C++与Matlab语言混编

这种方法是我最喜欢的方法,因为这样不但可以发挥matcom强大的数学计算功能,还可以结合可视化编译环境来进行界面开发,可以制作完整的应用计算软件,

交付用户使用。

我所用的可视IDE是Inprise公司的C++Builder 3.0/4.0,matcom版本为4.0/4.5,

注意,在CB4.0上只能使用matcom4.5版本。

在进行编程之前你需要作如下准备工作

1.选择菜单New\\Console Wizard\\Console Exe,建立一个Win32位DOS程序

2.将matcom\\lib\\matlib.h拷贝到CB\\include目录下

将matcom\\lib\\v4500b.lib拷贝到CB\\lib目录下

3.选择菜单Project\\Add to project\\选择lib\\v4500.lib

于是程序变为

#pragma hdrstop

#include

#include "stdio.h"

#include "matlib.h"

//--------------------------------------------------------------------------- USELIB("v4500b.lib");

//--------------------------------------------------------------------------- #pragma argsused

int main(int argc, char **argv)

{

/*****************************************/

// Please Write Your Code Here */

/*****************************************/

return 0;

}

3.选择菜单Project\\Add to Reportaries\\ 将该工程存为Project中的一个模板。

3.选择菜单Project\\Add to Reportaries\\ 将该工程存为Project中的一个模板。

OK,现在可以进行你所需要的工作了。

用菜单你存为的模板建立一个新的工程,在代码段写

dMm(a); //define a Matrix class

a=zeros(3); //Let the matrix be a 3*3 zero matrix

disp(a); //Display the matrix

运行一下看看,程序会打印出3*3的0零阵

稍微复杂一点的程序

dMm(a);dMm(b);dMm(c); //声明三个矩阵

a=rand(3,2); //生成3*2随机阵

b=zeros(3,2);

c=a+b; //矩阵相加

c(1,c_p)=a(2,c_p); //matlab中写为c(1,:)=a(2,:)

c=ctranspose(c); //矩阵转置

disp(c);printf("\\n");

disp(a);printf("\\n");

getch();

c(colon(1,1,3))=a(colon(1,2,5)); //matlab中写为c([1:1:3])=a([1:2:5])

disp(c);

getch();

getch();

getch();

可以发现在matlab中常用的一些表示都可以在matcom中找到对应,并且同样方便有效。

再举一个绘图的例子,就用matcom自己带的例子吧

subplot(121.0); //subplot(1,2,1)

surf((CL(peaks(25.0)))); //surf(peaks(25))

subplot(122.0); //subplot(1,2,2)

pcolor((CL(peaks(25.0)))); //pcolor(peaks(25))

colormap(TM("copper")); //colormap(\'copper\')

drawnow() //必须有这句,否则只画一个图出来

//这是我问他们的技术支持搞到的

可以看到基本上是一句对一句,没有什么多余的话。所以习惯编写

matlab程序的同志写matcom C的语句来也应该没有什么问题。

(但上面这个程序确实有问题,在mideva中编译后第二个subplot

是可以正常画出来的,但在CB中编译就只画一个subplot乐,具体

原因希望大家讨论,我现在也在试),mideva编译该语句的指令是

bcc32 文件名-IC:\\MATCOM45\\lib -H=matlib.csm -v -a4 -5 -e EXEFLAGS= -WC

DLLFLAGS= -WD

我想CB中可能要改option,大家试试看。

总的说来,决大多数的matlab的语句都可以轻松移植到CB中来,所以就可以直接在

CB中写matlab程序了,只是大家要注意几个关键的函数

colon(xstart,xstep,xstop) == xstart:xstep:xstop

(CL(A1),A2,A3....) == (A1,A2,A3,...)一个矩阵行,大多数

多参数输入函数都用到CL

(BR(a1),a2,a3....) == (a1,a2,a3...)

TM("a string") == \'a string\' TM将char *变为串矩阵

c_p == : 整行或整列

i_o == [out =fun(in)就写为fun(in, i_o, out)

其他的大家编几个程序就清楚了。

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(十三)

3.6 程序的发布

matcom可以用C编译器把.m文件编译为为stand_alone的程序,所以,基本上

不需要matlab系统,但一些必要的dll文件还是需要的,这些dll在window\\system\\

下面,(在 4.5版本中)大概有ago4500.dll,v4500v.dll,opengl32.dll, glu32.dll等

四个文件

如果用的是 4.0版本,发布时要把ago.dll,mlib4...dll(计不清楚了),opengl32.dll和

glu32.dll打到安装盘中,大概3M,然后在window目录安装一个名字叫mt_eval.txt的

文本文件,里面写1/1/1999-1/1/2010-64562264即可

--------------------------------------------------------------------------------

-- Matlab与C++接口与混合编程讨论小结(十四)

附录:Matcom C数学库函数列表(部分)

这是一个丰富的数学库,约600个函数,包括sim()函数

--------------------------------------------------------------------------

矩阵基础类

系统常数

特殊函数

异常处理函数

矩阵生成函数

操作系统资源函数

数值计算函数

数学函数

矩阵操作函数

矩阵属性函数

图形函数

颜色函数

用户介面函数

is*函数族

mex函数

字符串函数

字符串函数

字符串函数

类型转换函数

**************************************************** **********************

>>> 矩阵基础类

**************************************************** **********************

class Mm

{

DLLI Mm();

DLLI Mm(int isc, int iss, int nonzeros, int nrows, int ncols,

mt_matrix_ty

pes new_type=mt_double_matrix);

DLLI Mm(int isc, int iss, int nonzeros, int new_ndims, const int new_dims[

max_ndims], mt_matrix_types new_type=mt_double_matrix); DLLI Mm(i_o_t, const char* mname, int isglobal);

DLLI Mm(const char* mname, int m, int n);

DLLI Mm(int aisc, cMm x, cMm y, cMm dim1, op_t op, int do_dim, Mm& minmax_

idx);

DLLI Mm(m_type src);

DLLI Mm(cMm src);

DLLI Mm(cMm src, const char* mname);

DLLI Mm(const Mc& src);

DLLI Mm(cMr src, int err=1);

DLLI ~Mm();

Mm RDLLI operator =(cMm src);

void DLLI deepcopy(cMm src, mt_matrix_types new_type=mt_uninit_matrix);

void DLLI deepcopy(int isc, cMm src, mt_matrix_types new_type=mt_uninit_ma

trix);

void DLLI deepcopy(int isc, int iss, cMm src, mt_matrix_types new_type=mt_

uninit_matrix);

int DLLI getreal(int force=0) const;

int DLLI getcomplex();

void DLLI collapse();

inline int DLLI rows() const { return dims[0]; }

inline int DLLI cols() const { return dims[1]; }

int DLLI size() const;

int DLLI size(int dim) const;

int DLLI nsingleton() const;

int DLLI vectordim() const;

int DLLI length() const;

const char PDLLI getname() const { return self_name; }

void DLLI setname(const char* new_name);

int DLLI isstr() const { return (flags.str!=0); }

void DLLI setstr(int newd);

inline int DLLI issparse() const { return (flags.sparse!=0); }

void DLLI setsparse(int sp);

inline int DLLI islogical() const { return (flags.logical!=0); }

{ return (flags.logical!=0); }

void DLLI setlogical(int newd);

matlab图像处理实验报告

图像处理实验报告 姓名:陈琼暖 班级:07计科一班 学号:20070810104

目录: 实验一:灰度图像处理 (3) 实验二:灰度图像增强 (5) 实验三:二值图像处理 (8) 实验四:图像变换 (13) 大实验:车牌检测 (15)

实验一:灰度图像处理题目:直方图与灰度均衡 基本要求: (1) BMP灰度图像读取、显示、保存; (2)编程实现得出灰度图像的直方图; (3)实现灰度均衡算法. 实验过程: 1、BMP灰度图像读取、显示、保存; ?图像的读写与显示操作:用imread( )读取图像。 ?图像显示于屏幕:imshow( ) 。 ?

2、编程实现得出灰度图像的直方图; 3、实现灰度均衡算法; ?直方图均衡化可用histeq( )函数实现。 ?imhist(I) 显示直方图。直方图中bin的数目有图像的类型决定。如果I是个灰度图像,imhist将 使用默认值256个bins。如果I是一个二值图像,imhist使用两bins。 实验总结: Matlab 语言是一种简洁,可读性较强的高效率编程软件,通过运用图像处理工具箱中的有关函数,就可以对原图像进行简单的处理。 通过比较灰度原图和经均衡化后的图形可见图像变得清晰,均衡化后的直方图形状比原直方图的形状更理想。

实验二:灰度图像增强 题目:图像平滑与锐化 基本要求: (1)使用邻域平均法实现平滑运算; (2)使用中值滤波实现平滑运算; (3)使用拉普拉斯算子实现锐化运算. 实验过程: 1、 使用邻域平均法实现平滑运算; 步骤:对图像添加噪声,对带噪声的图像数据进行平滑处理; ? 对图像添加噪声 J = imnoise(I,type,parameters)

matlab图像处理的几个实例

Matlab图像处理的几个实例(初学者用) 1.图像的基本信息及其加减乘除 clear,clc; P=imread('yjx.jpg'); whos P Q=imread('dt.jpg'); P=im2double(P); Q=im2double(Q); gg1=im2bw(P,0.3); gg2=im2bw(P,0.5); gg3=im2bw(P,0.8); K=imadd(gg1,gg2); L=imsubtract(gg2,gg3); cf=immultiply(P,Q); sf=imdivide(Q,P); subplot(421),imshow(P),title('郁金香原图'); subplot(422),imshow(gg1),title('0.3'); subplot(423),imshow(gg2),title('0.5'); subplot(424),imshow(gg3),title('0.8'); subplot(425),imshow(K),title('0.3+0.5'); subplot(426),imshow(L),title('0.5-0.3'); subplot(427),imshow(cf),title('P*Q'); subplot(428),imshow(sf),title('P/Q'); 2.图像缩放 clear,clc; I=imread('dt.jpg'); A=imresize(I,0.1,'nearest'); B=imresize(I,0.4,'bilinear'); C=imresize(I,0.7,'bicubic'); D=imresize(I,[100,200]); F=imresize(I,[400,100]); figure subplot(321),imshow(I),title('原图'); subplot(322),imshow(A),title('最邻近插值'); subplot(323),imshow(B),title('双线性插值'); subplot(324),imshow(C),title('二次立方插值'); subplot(325),imshow(D),title('水平缩放与垂直缩放比例为2:1'); subplot(326),imshow(F),title('水平缩放与垂直缩放比例为1:4');

基于MATLAB平台的可视化图像处理系统设计方法

[收稿日期]20050228 [作者简介]黄书先(1962),女,1983年大学毕业,硕士,副教授,现主要从事石油勘探开发研究与科研管理工作。 基于MATLAB 平台的可视化图像处理系统 设计方法 黄书先 (长江大学科学技术处,湖北荆州434023) [摘要]以MATLAB 为工作语言和开发环境,开发了一个在M AT LAB 平台下的可视化图像处理系统, 可实现包括对测井图像在内的一般图像的精细处理,并能和用户开发的程序接口。为M AT LAB 的再开发 和可视化系统的设计作了有益的探索。 [关键词]MATLAB;图像处理;可视化GUI 界面 [中图分类号]TP 311111 [文献标识码]A [文章编号]16731409(2005)04015803 MAT LAB 的图像处理工具为自然科学各学科领域的学者、研究人员和工程师提供了一个直观的灵活的环境,用以解决复杂的图像处理问题。用MAT LAB 语言开发的图像处理算法可以在所有支持MAT LAB 的平台上共享。也可以将m 语言算法和现存的C 程序集成在一起或者将MATLAB 开发的m 语言算法和GU Is 编译为C/C++代码,供其他程序调用,或者发布为一个独立的应用程序。下面笔者提出一个基于MATLAB 平台的可视化图像处理系统设计方法,可用于包括测井图像资料在内的一般图像的精细处理。 1 系统总体设计 在MAT LAB 中有个重要的图像处理工具包[1],该工具包是由一系列支持图像处理操作的函数组成的,按功能可以分为以下几类:图像显示;图像文件输入与输出;几何操作;像素值统计;图像增强;图像识别;图像滤波;图像变换;邻域和块操作;二值图像操作;颜色映射和颜色空间转换;图像格式转换等。和其他工具包一样,用户还可以根据需要书写自己的函数,以满足特定的需要;也可以将这个工具包和信号处理工具包或小波工具包等其他工具包联合起来使用。 MAT LAB 提供了交互式的GU I 开发环境[2~4],用户只需要设置各个对象相应的属性,系统自动生成与之对应的界面,大大减少了开发的难度。本设计的MAT LAB 图像处理系统由封面、主界面和各个子功能界面组成,其框图如图1所示。程序总流程图如图2所示。 2 封面界面设计 首先用MAT LAB 编辑封面的脚本文件,生成系统的封面界面,然后再进入处理的主界面。 在设计封面时,要做好封面的总体布局,力求完美。要插入背景,首先要找到所用的函数(这在一般的书中很难找到);其次要注意设置axes 的属性。在显示背景图像时,不能用imshow ()函数,如果用此函数,背景图像只能显示在封面的一部分,不能整屏覆盖;而要用imagesc ()函数。MATLAB 提供修改文本中文字的字体,它支持华文中宋、华文彩云、华文仿宋、楷书、黑体等,功能较强。 在设计封面的过程中,最主要的技术是要解决时间的显示,如果只用MATLAB 中的clock ()函数,则显示的是静态时间,而不会显示和电脑同步的动态时间。为了解决这个问题,需做一个循环判断语句:while find (get (0,'c hildren'))==h0。成立的条件是,只要是当前窗口循环,否则停止,这样可以减少CPU 的负担。同时,要实时提取clock ()函数,可用fix (clock),使提取的时间更美观。#158#长江大学学报(自科版)2005年4月第2卷第4期/理工卷第2卷第2期 Jour nal of Yangtze University (Nat Sci Edit)Apr 12005Vol 12No 14/Sci &Eng V,Vol 12No 12

非常全非常详细的MATLAB数字图像处理技术

MATLAB数字图像处理 1 概述 BW=dither(I)灰度转成二值图; X=dither(RGB,map)RGB转成灰度图,用户需要提供一个Colormap; [X,map]=gray2ind(I,n)灰度到索引; [X,map]=gray2ind(BW,n)二值图到索引,map可由gray(n)产生。灰度图n 默认64,二值图默认2; X=graylice(I,n)灰度图到索引图,门限1/n,2/n,…,(n-1)/n,X=graylice(I,v)给定门限向量v; BW=im2bw(I,level)灰度图I到二值图; BW=im2bw(X,map,level)索引图X到二值图;level是阈值门限,超过像素为1,其余置0,level在[0,1]之间。 BW=im2bw(RGB,level)RGB到二值图; I=ind2gray(X,map)索引图到灰度图; RGB=ind2rgb(X,map)索引图到RGB; I=rgb2gray(RGB)RGB到灰度图。 2 图像运算 2.1图像的读写 MATLAB支持的图像格式有bmp,gif,ico,jpg,png,cur,pcx,xwd和tif。 读取(imread): [1]A=imread(filename,fmt) [2] [X,map]=imread(filename,fmt) [3] […]=imread(filename) [4] […]=imread(URL,…) 说明:filename是图像文件名,如果不在搜索路径下应是图像的全路径,fmt是图像文件扩展名字符串。前者可读入二值图、灰度图、彩图(主要是RGB);第二个读入索引图,map 为索引图对应的Colormap,即其相关联的颜色映射表,若不是索引图则map为空。URL表示引自Internet URL中的图像。 写入(imwrite): [1] R=imwrite(A,filename,fmt); [2] R=imwrite(X,map,filename,fmt); [3] R=imwrite(…,filename); [4] R=imwrite(…,Param1,Val1,Param2,Val2) 说明:针对第四个,该语句用于指定HDF,JPEG,PBM,PGM,PNG,PPM,TIFF等类型输出文件的不同参数。例如HDF的Quality,Compression,WriteMode;JPEG的BitDepth,Comment:Emptyor not,Mode:lossy orlossless,Quality等。 2.2 图像的显示 方法1:使用Image Viewer(图像浏览器),即运用imview函数。

基于MATLAB图像处理报告

基于M A T L A B图像处理报告一、设计题目 图片叠加。 二、设计要求 将一幅礼花图片和一幅夜景图片做叠加运算,使达到烟花夜景的美图效果。 三、设计方案 、设计思路 利用matlab强大的图像处理功能,通过编写程序,实现对两幅图片的像素进行线性运算,利用灰度变换的算法使图片达到预期的效果。 、软件介绍 MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。 MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB 也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户直接进行下载就可以用。

图像处理实例(含Matlab代码)

信号与系统实验报告——图像处理 学院:信息科学与工程学院 专业:2014级通信工程 组长:** 组员:** 2017.01.02

目录 目录 (2) 实验一图像一的细胞计数 (3) 一、实验内容及步骤 (3) 二、Matlab程序代码 (3) 三、数据及结果 (4) 实验二图像二的图形结构提取 (5) 一、实验内容及步骤 (5) 二、Matlab程序代码 (5) 三、数据及结果 (6) 实验三图像三的图形结构提取 (7) 一、实验内容及步骤 (7) 二、Matlab程序代码 (7) 三、数据及结果 (8) 实验四图像四的傅里叶变化及巴特沃斯低通滤波 (9) 一、实验内容及步骤 (9) 二、Matlab程序代码 (9) 三、数据及结果 (10) 实验五图像五的空间域滤波与频域滤波 (11) 一、实验内容及步骤 (11) 二、Matlab程序代码 (11) 三、数据及结果 (12)

实验一图像一的细胞计数 一、实验内容及步骤 将该图形进行一系列处理,计算得到途中清晰可见细胞的个数。 首先,由于原图为RGB三色图像处理起来较为麻烦,所以转为灰度图,再进行二值化化为黑白图像,得到二值化图像之后进行中值滤波得到细胞分布的初步图像,为了方便计数对图像取反,这时进行一次计数,发现得到的个数远远多于实际个数,这时在进行一次中值滤波,去掉一些不清晰的像素点,剩下的应该为较为清晰的细胞个数,再次计数得到大致结果。 二、Matlab程序代码 clear;close all; Image = imread('1.jpg'); figure,imshow(Image),title('原图'); Image=rgb2gray(Image); figure,imshow(Image),title('灰度图'); Theshold = graythresh(Image); Image_BW = im2bw(Image,Theshold); Reverse_Image_BW22=~Image_BW; figure,imshow(Image_BW),title('二值化图像'); Image_BW_medfilt= medfilt2(Image_BW,[3 3]); figure,imshow(Image_BW_medfilt),title('中值滤波后的二值化图像'); Reverse_Image_BW = ~Image_BW_medfilt; figure,imshow(Reverse_Image_BW),title('图象取反'); Image_BW_medfilt2= medfilt2(Reverse_Image_BW,[20 20]); figure,imshow(Image_BW_medfilt2),title('第二次中值滤波的二值化图像'); [Label, Number]=bwlabel(Image_BW_medfilt,8);Number [Label, Number]=bwlabel(Image_BW_medfilt2,8);Number

基于Matlab基本图像处理程序

图像读入 ●从图形文件中读入图像 imread Syntax: A = imread(filename, fmt) filename:指定的灰度或彩色图像文件的完整路径和文件名。 fmt:指定图形文件的格式所对应的标准扩展名。如果imread没有找到filename所制定的文件,会尝试查找一个名为filename.fmt的文件。 A:包含图像矩阵的矩阵。对于灰度图像,它是一个M行N列的矩阵。如果文件包含 RGB真彩图像,则是m*n*3的矩阵。 ●对于索引图像,格式[X, map] = imread(filename, fmt) X:图像数据矩阵。 MAP:颜色索引表 图像的显示 ●imshow函数:显示工作区或图像文件中的图像 ●Syntax: imshow(I) %I是要现实的灰度图像矩阵 imshow(I,[low high],param1, val1, param2, val2,...) %I是要现实的灰度图像矩阵,指定要显示的灰度范围,后面的参数指定显示图像的特定参数 imshow(RGB) imshow(BW) imshow(X,map) %map颜色索引表 imshow(filename) himage = imshow(...) ●操作:读取并显示图像 I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读取图像数据 imshow(I);%显示原图像 图像增强 一.图像的全局描述 直方图(Histogram):是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。 图像直方图(Image Histogram):是表示数字图像中亮度分布的直方图,用来描述图象灰度值,标绘了图像中每个亮度值的像素数。 灰度直方图:是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图 像中某种灰度出现的频率。描述了一幅图像的灰度级统计信息。是一个二维图,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的次数或概率。 归一化直方图:直接反应不同灰度级出现的比率。纵坐标表示具有各个灰度级别的像

基于MATLAB的图像处理

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目: 基于MATLAB的图像滤波设计 初始条件:1.MATLAB软件 2.滤波器处理相关函数 要求完成的主要任务: (1)读入图像并分别加入高斯噪声、椒盐噪声和乘性噪声,并比较结果。 (2)设计巴特沃斯低通滤波对图像进行低通滤波处理,显示结果。 (3)设计高斯高通滤波器对图像进行处理,显示结果。 (4)采用维纳滤波和中值滤波对图像进行处理,显示结果 参考书: 1.《信号与系统》第一版刘泉江雪梅主编高等教育出版社 2.《数字图像处理》MATLAB版冈萨雷斯主编电子工业出版社 时间安排: 第15周:任务安排、分组 第16周:理论设计及仿真 第18周:撰写设计报告及答辩 指导教师签名:年月日系主任(或责任教师)签名:年月日

摘要 (3) 1.MATLAB简介 (5) 1.1 MATLAB的概况 (5) 1.2 MATLAB产生的历史背景 (5) 2.编程及运行结果 (7) 2.1常见基本运算 (7) 2.1.1极限的计算 (7) 2.1.2微分的计算 (7) 2.1.3积分的计算 (8) 2.1.4级数的计算 (9) 2.1.5求解代数方程 (10) 2.1.6求解常微分方程 (10) 2.2 矩阵基本计算 (11) 2.2.1矩阵的最大值 (11) 2.2.2矩阵的最小值 (11) 2.2.3矩阵的均值 (12) 2.2.4矩阵的方差 (13) 2.2.5矩阵的转置 (13) 2.2.6矩阵的逆 (14) 2.2.7矩阵的行列式 (15) 2.2.8矩阵的特征值计算 (15) 2.2.9矩阵的相乘 (16) 2.2.10矩阵的右除和左除 (17) 2.2.11矩阵的幂运算 (18) 2.3 多项式基本计算 (18) 2.3.1多项式加减运算 (18) 2.3.2多项式乘除运算 (19) 2.3.3多项式求导 (20) 2.3.4求根和求值运算 (20) 2.3.5多项式的部分分式展开 (21) 2.3.6多项式的拟合 (22) 2.3.7插值运算 (23) 3.基于MATLAB的图像滤波设计 (25) 3.1读入图像并分别加入高斯噪声、椒盐噪声和乘性噪声,并比较结果 (25) 3.2设计巴特沃斯低通滤波对图像进行低通滤波处理,显示结果 (29) 3.2.1叠加椒盐噪声的巴特沃斯低通滤波 (29) 3.2.2叠加高斯噪声的巴特沃斯低通滤波 (31) 3.2.3叠加乘性噪声的巴特沃斯低通滤波 (32) 3.3用MATLAB实现高斯高通滤波器对图像的处理 (33) 3.4维纳滤波和中值滤波对图像进行处理 (35) 4.总结 (38) 参考文献 (39)

MATLAB课程设计-图像处理完整版

MATLAB课程设计 设计题目:应用图像处理 班级: 学号: 姓名: 指导老师: 设计时间:2013年4月8号-4月14号

摘要 21世纪是一个充满信息的时代,图像作为人类感知世界的视觉基础,是人类获取信息、表达信息和传递信息的重要手段。图像处理,是用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。基本容图像处理一般指数字图像处理。数字图像是指用数字摄像机、扫描仪等设备经过采样和数字化得到的一个大的二维数组,该数组的元素称为像素,其值为一整数,称为灰度值。图像处理技术的主要容包括图像压缩,增强和复原,匹配、描述和识别3个部分。常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。图像处理一般指数字图像处理。所谓数字图像处理[7]就是利用计算机对图像信息进行加工以满足人的视觉心理或者应用需求的行为。实质上是一段能够被计算机还原显示和输出为一幅图像的数字码。 关键词:DCT变换;图像压缩;真色彩增强;平滑;锐化;直方图均衡; 灰度变换;滤波;M文件的使用 目录 摘要………………………………………………………………I 1 概述……………………………………………………………II 2 课程设计任务及要求...............................III 2.1.1设计任务 2.1.2设计要求 3 系统设计原理 (Ⅳ)

3.1 DCT图像压缩原理 3.2 真彩色增强 3.2.1平滑 3.2.2锐化 3.3 灰度变换(直方图均衡化) 3.4 图像滤波 3.4.1中值滤波器 3.4.2维纳滤波器 4 程序代码及实验结果与分析 (Ⅵ) 4.1 DCT图像压缩 4.1.1程序代码 4.1.2实验结果 4.1.3结果分析 4.2 真彩色增强 4.2.1平滑程序代码 4.2.2实验结果 4.2.3结果分析 4.2.4锐化程序代码 4.2.5实验结果 4.2.6结果分析 4.3 灰度变换(直方图均衡化) 4.3.1程序代码

MATLAB中图像函数大全 详解及例子

图像处理函数详解——strel 功能:用于膨胀腐蚀及开闭运算等操作的结构元素对象(本论坛随即对膨胀腐蚀等操作进行讲解)。 用法:SE=strel(shape,parameters) 创建由指定形状shape对应的结构元素。其中shape的种类有 arbitrary' 'pair' 'diamond' 'periodicline' 'disk' 'rectangle' 'line' 'square' 'octagon 参数parameters一般控制SE的大小。 例子: se1=strel('square',6) %创建6*6的正方形 se2=strel('line',10,45) %创建直线长度10,角度45 se3=strel('disk',15) %创建圆盘半径15 se4=strel('ball',15,5) %创建椭圆体,半径15,高度5

图像处理函数详解——roipoly 功能:用于选择图像中的多边形区域。 用法:BW=roipoly(I,c,r) BW=roipoly(I) BW=roipoly(x,y,I,xi,yi) [BW,xi,yi]=roipoly(...) [x,y,BW,xi,yi]=roipoly(...) BW=roipoly(I,c,r)表示用向量c、r指定多边形各点的X、Y坐标。BW选中的区域为1,其他部分的值为0. BW=roipoly(I)表示建立交互式的处理界面。 BW=roipoly(x,y,I,xi,yi)表示向量x和y建立非默认的坐标系,然后在指定的坐标系下选择由向量xi,yi指定的多边形区域。 例子:I=imread('eight.tif'); c=[222272300270221194]; r=[21217512112175]; BW=roipoly(I,c,r); imshow(I)

matlab 图像处理报告

《 MATLAB 实践》 课程设计 学生姓名: 学号: 专业班级: 指导教师: 二○○九年三月十三日

1.设计目的…………………………………………………第 3页 2.题目分析…………………………………………………第3 页 3.总体设计…………………………………………………第4 页 4.具体设计…………………………………………………第 6页 5.结果分析…………………………………………………第 20页 6.心得体会…………………………………………………第 20页 7.参考书目…………………………………………………第 20页

1 课程设计的目的: 综合运用MATLAB工具箱实现图像处理的GUI程序设计。 2、题目分析 课程设计的基本要求 1)熟悉和掌握MATLAB 程序设计方法 2)掌握MATLAB GUI 程序设计 3)学习和熟悉MATLAB图像处理工具箱 4)学会运用MATLAB工具箱对图像进行处理和分析 课程设计的内容 学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。 以下几点是程序必须实现的功能。 1)图像的读取和保存。 2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。 3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。 4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。 5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。 6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。比较去噪效果。

matlab图像处理小结

1.function [center, r] = solve_circle(pt1, pt2, pt3) 2.%Effect: solve the circle which across points 'pt1', 'pt2' and 'pt3' 3.%Inputs: 4.%pt1, pt2, pt3: [x, y] 5.%center: the circle center [x0; y0] 6.%r: the radius of the circle 7.%Author: Su dongcai at 2012/1/2 8. A = zeros(2, 2); B = zeros(2, 1); 9.[A(1, :), B(1)] = circle2line(pt1, pt2); 10.[A(2, :), B(2)] = circle2line(pt2, pt3); 11.center = A\B; 12.r = norm(pt1' - center); 13. 14.function [A, B] = circle2line(pt1, pt2) 15.%Effect: cast 2 circles equation into 1 linear equation: 16.%(a-x1)^2 + (b-y1)^2 = r^2 | 17.% |==> 2(x1-x2)a + 2(y1-y2)b = (x1^2 + y1^2) - (y2^2 + y2^2) 18.%(a-x2)^2 + (b-y2)^2 = r^2 | 19.%Inputs: 20.%pt1, pt2: [x1, y1], [x2, y2] 21.%Outputs: 22.%A: 2[x1-x2, y1-y2] 23.%B: (x1^2 + y1^2) - (x2^2 + y2^2) 24.%Author: Su dongcai at 2012/1/2 25.A = 2*(pt1 - pt2); 26.B = norm(pt1)^2 - norm(pt2)^2; close all;clear;clc; >> i=imread('rice.png'); %>> imshow(i); >> background=imopen(i,strel('disk',15)); >> i2=imsubtract(i,background); %>> figure,imshow(i2); >> i3=imadjust(i2,stretchlim(i2),[0 1]); %>> figure,imshow(i3); >> level=graythresh(i3); >> bw=im2bw(i3,level); %>> figure,imshow(bw); >> [labeled,numobjects]=bwlabel(bw,4); graindata=regionprops(labeled,'all');

基于Matlab基本图像处理程序

图像读入 ●从图形文件中读入图像imread Syntax: A = imread(, fmt) :指定的灰度或彩色图像文件的完整路径和文件名。 fmt:指定图形文件的格式所对应的标准扩展名。如果imread没有找到所制定的文件,会尝试查找一个名为的文件。 A:包含图像矩阵的矩阵。对于灰度图像,它是一个M行N列的矩阵。如果文件包含RGB 真彩图像,则是m*n*3的矩阵。 ●对于索引图像,格式[X, map] = imread(, fmt) X:图像数据矩阵。 MAP:颜色索引表 图像的显示 ●imshow函数:显示工作区或图像文件中的图像 ●Syntax: imshow(I) %I是要现实的灰度图像矩阵 imshow(I,[low high],param1, val1, param2, val2,...) %I是要现实的灰度图像矩阵,指定要显示的灰度范围,后面的参数指定显示图像的特定参数 imshow(RGB) imshow(BW) imshow(X,map) %map颜色索引表 imshow() himage = imshow(...)

●操作:读取并显示图像 I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读取图像数据 imshow(I);%显示原图像 图像增强 一.图像的全局描述 直方图(Histogram):是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。 图像直方图(Image Histogram):是表示数字图像中亮度分布的直方图,用来描述图象灰度值,标绘了图像中每个亮度值的像素数。 灰度直方图:是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。描述了一幅图像的灰度级统计信息。是一个二维图,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的次数或概率。 归一化直方图:直接反应不同灰度级出现的比率。纵坐标表示具有各个灰度级别的像素在图像中出现的概率。 图像的灰度直方图:是一个离散函数,表示图像每一灰度级与该灰度级出现概率的对应关系。 图像的灰度直方图运算: imhist()函数,其横坐标表示像素的灰度级别,纵坐标为像素点的个数。 ●Imhist函数=Display histogram of image data显示灰度直方图的函数 ●Syntax: ①imhist(I) % I为要计算的灰度直方图图像 ②imhist(I, n) % n指定的灰度级的数目,表示所有灰度级均匀分布在n个小区间内。 ③imhist(X, map) ④[counts,x] = imhist(...) %counts直方图数据向量。counts(i)第i个灰度区间中的像素数目。x是保存了对应的灰度小区间的向量。 注意:若调用时不接受这个函数的返回值,则直接显示直方图;在得这些返回数据之后,也可以使用stem(x,counts)手绘直方图。 ●例1:显示某一图像的灰度直方图

图像增强及MATLAB实现

《数字图像处理》课程设计 课设题目:图像增强与MATLAB实现学校学院:华东交通大学理学院 学生班级:13级信息计算(2)班学生:超 学生学号:20130810010216 指导老师:自柱

图像增强与MATLAB实现 摘要 数字图像处理是指将图像信号转换成数字格式并利用计算机对其进行处理的过程。图像增强是数字图像处理的过程中经常采用的一种方法,它对提高图像质量起着重要的作用。本文先对图像增强的原理进行概述,然后对图像增强的方法分类并给出直方图增强、对比度增强、平滑和锐化等几种常用的增强方法的理论基础,通过Matlab实验得出的实际处理效果来对比各种算法的优缺点,讨论不同的增强算法的技术要点,并对其图像增强方法进行性能评价。 关键字:图像;图像增强;算法

目录 一、MATLAB的简介 (1) 1.1MATLAB主要功能 (1) 二、MATLAB的主要功能 (1) 2.1数字增强技术概述 (1) 2.2数字图像的表示 (2)

三、直方图的均衡化 (2) 3.1图像的灰度 (2) 3.2灰度直方图 (2) 3.3直方图均衡化 (3) 四、图像二值化 (5) 4.1图像二值化 (5) 五、对比度增强 (7) 5.1对比度增强 (7) 5.2灰度调整 (8) 5.3对数变换 (9) 六、滤波 (10) 6.1平滑滤波 (10) 6.2线性平滑滤波程序: (11) 6.3非线性滤波 (12) 七、锐化 (18) 八、参考文献 (19) 九、自我评价 (20)

一、Matlab的简介 1.1 MATLAB主要功能 MATLAB是建立在向量、数组和矩阵基础上的一种分析和仿真工具软件包,包含各种能够进行常规运算的“工具箱”,如常用的矩阵代数运算、数组运算、方程求根、优化计算及函数求导积分符号运算等;同时还提供了编程计算的编程特性,通过编程可以解决一些复杂的工程问题;也可绘制二维、三维图形,输出结果可视化。目前,已成为工程领域中较常用的软件工具包之一。 二、MATLAB的主要功能 2.1数字增强技术概述 图像增强是按特定的需要突出一幅图像中的某些信息,同时,消弱或去除某些信息使得图像更加实用。图像增强技术主要包含直方图修改处理、图像平滑处理、图像尖锐化处理等。 图像增强技术主要包括:直方图修改处理,图像平滑处理,图像尖锐化处理,彩色图像处理。从纯技术上讲主要有两类:频域处理法和空域处理法。 频域处理法主要是卷积定理,采用修改图像傅立叶变换的方法实现对图像的增强处理技术;空域处理法:是直接对图像中的像素进行处理,基本上是以灰度映射变换为基础的。

MATLAB课程设计报告图像处理

一.课程设计相关知识综述...................................................................... 1.1 研究目的及意义 (3) 1.2 数字图像处理研究的内容........................................................... 1.3 MATLAB 软件的介绍.................................................................. 1.3.1 MATLAB 语言的特点......................................................... 1.3.2 MATLAB 图像文件格式.................................................... 1.3.3 MATLAB 图像处理工具箱简介........................................ 1.3.4 MATLAB 中的图像类型.................................................... 1.3.5 MATLAB 的主要应用........................................................ 1.4 函数介绍........................................................................................ 二.课程设计内容和要求........................................................................... 2.1 主要研究内容................................................................................ 2.2 具体要求....................................................................................... 2.3 预期达到的目标........................................................................... 三.设计过程............................................................................................... 3.1 设计方案及步骤............................................................................ 3.2 程序清单及注释........................................................................... 3.3 实验结果........................................................................................ 四.团队情况................................................................................................ 五.总结....................................................................................................... 六.参考文献............................................................................................... 一.课程设计相关知识综述. 1.1研究目的及意义

matlab图像处理综合实验实验报告

《数字图像处理》 实验报告 学院: 专业: 班级: 姓名: 学号:

实验一 实验名称:图像增强 实验目的:1.熟悉图像在Matlab下的读入,输出及显示; 2.熟悉直方图均衡化; 3.熟悉图像的线性指数等; 4.熟悉图像的算术运算及几何变换. 实验仪器:计算机,Matlab软件 实验原理: 图像增强是为了使受到噪声等污染图像在视觉感知或某种准则下尽量的恢复到原始图像的水平之外,还需要有目的性地加强图像中的某些信息而抑制另一些信息,以便更好地利用图像。图像增强分频域处理和空间域处理,这里主要用空间域的方法进行增强。空间域的增强主要有:灰度变换和图像的空间滤波。 图像的直方图实际上就是图像的各像素点强度概率密度分布图,是一幅图像所有像素集合的最基本统计规律,均衡化是指在每个灰度级上都有相同的像素点过程。 实验内容如下: I=imread('E:\cs.jpg');%读取图像 subplot(2,2,1),imshow(I),title('源图像') J=rgb2gray(I)%灰度处理 subplot(2,2,2),imshow(J) %输出图像 title('灰度图像') %在原始图像中加标题 subplot(2,2,3),imhist(J) %输出原图直方图 title('原始图像直方图') 0100200

I=imread('E:\cs.jpg');%读取图像 subplot(1,2,1),imshow(I); theta = 30; K = imrotate(I,theta); subplot(1,2,2),imshow(K) 对数运算: I=imread('E:\dog.jpg'); subplot(2,2,1),imshow(I),title('源图像') J=rgb2gray(I)%灰度处理 subplot(2,2,2),imshow(J),title('灰度变换后图像') J1=log(1+double(J)); subplot(2,2,3),imshow(J1,[]),title('对数变换后') 指数运算: I=imread('E:\dog.jpg'); f=double(I); g=(2^2*(f-1))-1 f=uint8(f); g=uint8(g);

图像处理matlab程序实例

程序实例 1旋转: x=imread('d:\MATLAB7\work\flower.jpg'); y=imrotate(x,200,'bilinear','crop'); subplot(1,2,1); imshow(x); subplot(1,2,2); imshow(y) 2.图像的rgb clear [x,map]=imread('D:\Program Files\MATLAB\R2012a\bin\shaohaihe\shh1.jpg');y=x(90:95,90:95);imshow(y)R=x(90:95,90:95,1);G=x(90:95,90:95,2);B=x(90:95,90:95,3);R,G,B 3.加法运算clear I=imread('D:\Program Files\MATLAB\R2012a\bin\shaohaihe\shh3.jpg');J=imnoise(I,'gaussian',0,0.02);%向图片加入高斯噪声subplot(1,2,1),imshow(I);%显示图片subplot(1,2,2),imshow(J);K=zeros(242,308);%产生全零的矩阵,大小与图片的大小一样for i=1:100%循环100加入噪声J=imnoise(I,'gaussian',0,0.02);J1=im2double(J);K=K+J1;end K=K/100; figure,imshow(K);save

4.减法 clear I=imread('D:\Program Files\MATLAB\R2012a\bin\shaohaihe\shao.jpg'); J=imread('D:\Program Files\MATLAB\R2012a\bin\shaohaihe\shao1.jpg'); K=imsubtract(I,J);%实现两幅图相减 K1=255-K;%将图片求反显示 figure;imshow(I); title('有噪声的图'); figure;imshow(J); title('原图'); figure;imshow(K1); title('提取的噪声'); save 5.图像的乘法 H=imread('D:\Program Files\MATLAB\R2012a\bin\shaohaihe\shao.jpg'); I=immultiply(H,1.2);将此图片乘以1.2 J=immultiply(H,2); subplot(1,3,1),imshow(H); title('原图'); subplot(1,3,2),imshow(I); title('·放大1.2'); subplot(1,3,3),imshow(J); title('放大2倍'); 6除法运算 moon=imread('moon.tif'); I=double(moon); J=I*0.43+90; K=I*0.1+90; L=I*0.01+90; moon2=uint8(J); moon3=uint8(K); moon4=uint8(L); J=imdivide(moon,moon2); K=imdivide(moon,moon3); L=imdivide(moon,moon4); subplot(2,2,1),imshow(moon); subplot(2,2,2),imshow(J,[]); subplot(2,2,3),imshow(K,[]); subplot(2,2,4),imshow(L,[]);

相关主题
文本预览
相关文档 最新文档