我简单介绍一下我要处理和识别的图像:
图像连接:http://blog.edu.cn/UploadFiles/2006-4/42844059.bmp
          http://blog.edu.cn/UploadFiles/2006-4/42861720.bmp
          http://blog.edu.cn/UploadFiles/2006-4/42326878.bmp
这是原子发射光谱的图像,对于明暗相间的谱线来说,感兴趣的只是谱线的相对位置,但是实际拍摄的时候,整幅图像可能左右移动,大体情况就是如此。现请教大家两个问题:1.图像处理的顺序问题
对比度增强,灰度化,滤波,边缘提取,二值化等这些处理的步骤是固定的么,还是按自己的图像来说
至于算法,大家有什么比较好的建议么2.图像识别算法
对二值化后的图像进行识别判断(与标准的图像比对),
总体想法:先将图像数据读入数组中,再比对
首先,需要先将图像翻转至谱线竖直(有可能歪斜),这个算法怎么实现呢?
然后,就是将数据读入到数组中,这个比对的算法又如何呢,相关运算,卷积运算,大家给点意见吧

解决方案 »

  1.   

    楼主如果用的是vb的话,不要求速度的话,vb中一个api函数实现翻转的,至于比较的话,可以建一个模板,去运算,
    仅仅是一点点建议!!!
      

  2.   

    速度也是要求的阿
    模板具体该怎么建呢
    再详细点呗我现在能想到的很简单,二值化之后的图像见 http://blog.edu.cn/UploadFiles/2006-4/43910444.bmp
    就是把000111(0为黑,背景;1为白,图像)的数据存入一个数组,也就是这幅图像的所有信息,进行相关运算,相关系数大则为同一幅图。
    相关运算大家做过么?
    或者别的想法也好,期待中...
      

  3.   

    为什么不用matlab呢,我做的信号强度的东西。只要算法建立了,用matlab一扫就出来了
    空间的信号强度叠加,颜色显示看起来和谱线差不多。也可能我理解错了,希望有帮助
      

  4.   

    不太明白clear_zero的意思:(
    我的界面和数据输入什么的都是用VB做的,再用Matlab处理可能不现实,倒是想过VC,可是一来没用过,二来觉得可能会很麻烦,所以作罢
    其实我这个图像比较,就是模式识别的东西,以前没做过多谢大家的参与,期待着下一位的参与 :)
      

  5.   

    處理這种問題建議還是使用Matlab,不是VB/VC能處理或不能處理,首先需要相關的知識,其次還需要相當的處理代碼,Metlab則是針對此類似處理,其在此類問題上相對VB要專業得多.
      

  6.   

    http://www.faq-it.org/archives/vb/d1a6f11a82aa54f0f4b2c22910fb186c.php
    http://www.yesky.com/348/1896848.shtml
      

  7.   

    楼上的顺便问一下,如果把处理的结果用来控制东西是否可以用matlab
      

  8.   

    很抱歉,樓上這個問題我也不知道,其實我只是聽說有Matlab這東東,其余對它一無所知.
      

  9.   

    有了一些新的想法:
       要实现两副图像是否一致的判断,先把图像作灰度处理,然后“对齐”两副图像,将边缘提取出来的上下两个平行的边和突出的三角作为基准来对齐(典型图片:http://blog.edu.cn/UploadFiles/2006-4/42844059.bmp),就是将图像作倾斜校正,然后作差运算或者同或、异或运算,大家觉得如何?
       倾斜校正这个算法怎么实现呢,给点意见吧:)
      

  10.   

    我的界面和数据输入什么的都是用VB做的,再用Matlab处理可能不现实===============vb可以直接调用Matlab的
      

  11.   

    用matlab现成的算法确实比较方便。vb和matlab交互主要有com\DDE\等等
      

  12.   

    这些运算放到matlab非常方便,我觉得做图像处理会有矩阵运算的。这个也是matlab的强项
    然后画彩色也可以的,渐变很好。
    具体的方法我不记得了,肯定能找到。
    vb我实在不知道怎么弄。
      

  13.   

    vb可以直接调用Matlab的
    但是会不会影响速度呢vb的图像处理也很简单,只是现在的模式识别的问题,搞的我无从下手
    还有二值化域值的自适应算法,有做过的么,我现在都是给定的域值,觉得这样不保险。
      

  14.   

    补充说明:
    我这个是要做成成品的
    就是说单机只带这一个应用程序,开机就进入界面的那种
    要是又vb又matlab的该如何做呢这种方案的可行性如何,库之间的调用不会很费时么一头雾水了,高手指点一下阿
      

  15.   

    【转贴】摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。 
        关键词: VB VC++ MATLAB DLL 编译 MATLAB Add-in
    MATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的问题。
    Visual Basic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。因此实现VB与MATLAB混合编程,可以为科研工作和工程应用提供有力的技术支持。
    1 基本思路及实现方法
    MATLAB提供了与C++、Fortran的程序接口,并没有提供直接与VB的接口。目前VB与MATLAB混合编程方面主要使用以下一些方法:
    (1)在VB中通过调用MATLAB的引擎(Engine)接口,使用Windows的OLE或ActiveX通道与MATLAB通信。通过Object.ExecuteMATLAB语句在程序中直接使用MATLAB提供的函数库和图形库。这种方法可以较快地编写出程序;但在调用引擎时,会在后台启动一个MATLAB进程,影响程序运行速度,占用内存。
    (2)通过使用嵌入VB的矩阵函数库MatrixVB的方法。MatrixVB是由原MathTools公司开发的第三方插件,利用与MATLAB相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用MATLAB函数。这种方法语法和函数使用比较简单,编程效率很高,几乎完全融入VB语言,特别对图形的处理非常方便,弥补了其他方法在图形处理上的弱点。安装后,只需在打开的工程中添加MatrixVB库即可(在工程->引用对话框中选中MMatrix)。但由于其仍然采用解释执行,执行效率较低,实时运算难以实现。
    (3)借助Visual C++与MATLAB的接口,将MATLAB的程序文件(.M)编译为动态链接库(.DLL),VB在代码中调用生成的.DLL中的函数,实现算法,便于用户脱离MATLAB环境使用。由于算法部分采用C++语句,运行速度较快,可应用于实时运算。这种方法对开发者在设置和编程上有一定要求,本文将详细阐述具体实现步骤。其基本思路如图1所示。
    第一步,编写M文件。在MATLAB中打开Editor,按照MATLAB程序格式输入代码,实现算法,调试成功。注意:M文件必须以Function开始,避免在VC++中出现转换错误。
    第二步,使用MATLAB6.0新提供的编译插件MATLAB Add-in在VC++中转换为C文件。在转换前做好MATLAB与VC++的接口连接。步骤如下:
    •在MATLAB中运行“mex -setup”,选择Microsoft Visual C/C++ version 6.0选项,安装MATLAB Add-in文件到VC++目录,确认;接着运行“mbuild -setup”,选择Microsoft Visual C/C++ version 6.0作为本地默认编译器;然后在MATLAB下运行“cdprefdir”和“mccsavepath”命令,MATLAB Add-in可以脱离MATLAB环境找到MATLAB路径。
    •在VC++中选择“工具tools->定制(customize)->附加项和宏文件Add-ins and Macro Files页”,选中“MATLAB Add-in”。这样,在VC++工具栏出现MATLAB Add-in图标,在VC++新建工程对话框中会出现“MATLAB Project Wizard”。至此连接工作完成。
    •打开VC++,在新建工程中选择“MATLAB Project Wizard”,按照提示,选择“Shalled M-dll”,输入M文件位置,VC++开始转换。如果M文件没有错误,在工程文件夹中会生成一系列.C文件。其中与M文件同名的.C文件即为转换的C代码。
    第三步,编译DLL文件(强烈建议不要对刚刚生成的C代码作任何修改)。选择“编译”菜单,构建.DLL文件,在文件夹中会生成与工程名相同的DLL文件。
    第四步,在VB中调用DLL文件。在第二步生成的C代码中找到所要的接口函数,注意大小写,记下函数名。在VB中使用Declare语句声明这个函数。在窗体的“通用-声明”输入如下语法:
    Declare Function /Sub <函数名> Lib “<dll文件名>”Alias “<函数名>” <参数表> as <type>(具体语法可参看VB使用手册)。
    在程序代码中直接调用声明的函数即可。需要注意的是函数调用过程中的参数传递问题。由于VB和C的数据类型以及参数传递形式不太一样,传递不当,可能会造成调试困难。特别是MATLAB中用到的大量矩阵(数组)参数,调用需十分当心。本文在下面例子中采用文件方式传递参数,利用VB和MATLAB的文件读写功能传递数组参数,对于实时性要求不高的应用,可以方便稳妥地实现数据传递。
    2 应用举例
    在VB中利用随机数生成16个10以内的整数,作为一个信号序列,利用MATLAB的快速傅立叶变换函数(FFT())对序列进行变换,再将变换结果传递回VB,并显示在窗体上。
    在MATLAB中编辑好M文件(test.m),实现读取序列文件及FFT并写回序列文件,调试成功。代码如下:
    function t
    fid=fopen't.txt''rt+' %以读写文本方式打开
    文件
    acount=fscanffid'%d' %文件以整数格式读入
    矩阵a
    m=fftacount %FFT运算
    frewindfid %文件指针指向文件头
    fprintffid'%f\n'm %向文件写入矩阵m
    fclosefid
    按照前述步骤在VC++中转换为test.c文件,找到接口函数,本例为mlfTest()。
    void mlfTest(void){ 
    mlfEnterNewContext(0,0);
    Mtest();
    mlfRestorePreviousContext(0,0);
    }
    编译生成test.dll文件。
    在VB中生成随机序列并写入文件:
    Private Sub Command1_Click()
    Randomize
    Dim i As Integer
    Dim a As Integer
    Dim b As String
    Text1.Text = ″″
    Open App.Path & ″\t.txt ″ For Output As #1
    For i = 1 To 16
    a = Int(10 * Rnd)
    Print #1, LTrim(a)
    b = b & Str(a) & Chr(13) & Chr(10)
    Next i
    Text1.Text = b
    Close #1
    End Sub
    声明mlfTest()函数:
    Private Declare Sub mlfTest Lib ″G\test\dll\dll.dll″ 
    调用该函数的事件代码:
    Private Sub Command2_Click()
    MlfTest '调用函数
    End Sub
    本例中未向函数传递参数,也无需函数返回运算结果,故采用调用子程序过程(Sub)方式直接调用。结果由VB读取文件获得:
    Private Sub Command3_Click()
    Dim str1 As String
    Dim str2 As String
    Text2.Text = ″″
    Open App.Path & ″\t.txt″ For Input As #1
    Do While Not EOF1
    Line Input #1 str1
    str2 = str2 & str1 & Chr(13) & Chr(10)
    Loop
    Text2.Text = str2
    Close #1
    End Sub
    本例在Windows XP、VB6.0、VC++6.0、MATLAB6.5下调试通过。VB与MATLAB的混合编程,可以脱离MATLAB环境运行,有利于程序发布及使用。通过二者结合,减少了设计算法的时间,降低了编程难度,同时兼顾了代码安全和界面友好。程序界面如图2所示。 
     
      

  16.   

    【转贴】工业生产中经常遇到复杂的数据信息处理问题,需要大运算量的矩阵计 算及对分析结果进行实时、直观的图形化显示。Matlab是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件,将其强大的计算功能与VB 在图形用户界面开发方面的优势结合起来,实现应用系统的无缝集成,对于有效缩短开发周期、优化系统性能是十分有意义的。下面将分别讨论Matlab与VB 集成的四种方法。 
    一、借助 ActiveX部件 
    Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够 在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将 Matlab作为Visual Basic语言的一个ActiveX部件调用。 
    Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务 支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述: 
    ● BSTR Execute([in] BSTR Command); 
    BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。 
    ● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi); 
    该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。 
    ● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi); 
    该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。 
    示例代码如下: 
    Dim Matlab As Object ’声明对象 
    Dim MReal1(5,5) As Double 
    ’声明存放实部的Double型数组 
    Dim MImag() As Double 
    ’声明存放虚部的Double型数组 
    Set Matlab=CreateObject(“Matlab.Application”) ’初始化对象 
    Matlab.Execute(“a=hilb(5)”) 
    ’执行Matlab命令 
    Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag) 
    ’将结果分别存入实部、虚部数组 
    二、借助DDE技术 
    DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端 (Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab作为服务器时与其他应用程序的通信机制。 图1 借助DDE时应用程序通信机制 
    图1 借助DDE时应用程序通信机制 
    其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。 
    初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。 
    下面的示例说明了VB与Matlab建立并完成DDE会话的全过程: 
    说明: TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。 
    Sub TextInput_KeyPress(KeyAscii As Integer) 
    If KeyAscii = vbKeyReturn then 
    ’初始化TextInput与Matlab间的DDE会话 
    TextInput.LinkMode = vbLinkNone 
    TextInput.LinkTopic = “MATLAB|Engine” 
    TextInput.LinkItem =“EngEvalString” 
    TextInput.LinkMode = vbLinkManual 
    szCommand = TextInput.Text 
    ’执行Matlab命令 
    TextInput.LinkExecute szCommand 
    TextInput.LinkMode = vbLinkNone 
    ’初始化TextOutput与Matlab间的DDE会话 
    TextOutput.LinkMode = vbLinkNone 
    TextOutput.LinkTopic = “MATLAB|Engine” 
    TextOutput.LinkItem =“EngStringResult” 
    TextOutput.LinkMode = vbLinkManual 
    ’返回执行结果并显示 
    TextOutput.LinkRequest 
    TextOutput.LinkMode = vbLinkNone 
    End If 
    End Sub 
    三、通过M文件 
    Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集成。 
    1. 用mcc生成独立的外部应用程序。可使用如下两种命令: 
    mcc -p file.m 或 mcc -m file.m 
    2. 在VB中声明调用的三个API函数: 
    ● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 
    ● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long 
    ● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long 
    3. 示例代码: 
    Dim lTask As Long, lret As Long, lHandle As Long 
    ’执行file.exe文件 
    lTask = Shell(“file.exe”, vbNormalFocus) 
    lHandle = OpenProcess(SYNCHRONIZE, False, lTask) 
    ’等待进程执行完毕 
    lret = WaitForSingleObject(lHandle, INFINITE) 
    lret = CloseHandle(lHandle) 
    ’ file.exe文件执行完毕后,继续执行应用程序 
    …… 
    通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。 
    四、引入MatrixVB 
    MatrixVB是MathWorks针对VB提供的一个Matlab库,它提供了600多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、 串运算及图形图像处理功能等,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。 
    MatrixVB是一个独立的产品(可以从www.mathworks.com得到),其使用十分方便。MatrixVB安装完成后,只需在VB工程中引用Mmatrix即可。 
    示例代码如下: 
    说明: 工业生产中经常需要对采集到的原始信号进行分析,并对分析结果进行实时的图形化显示,下面通过在VB中引用Mmatrix来实现这一功能。代码如下: 
    Dim ax as Variant ’声明坐标轴 
    Private Sub Form_Resize() 
    vbrefresh ax ’刷新坐标轴 
    End Sub 
    Private Sub Form_Load() 
    ax = vbaxes(Form1.hWnd) 
    ’将坐标轴置于窗体 
    Call Form_Resize 
    End Sub 
    Private Sub Command1-Click() 
    Dim I,C As Matrix ’声明向量 
    Dim m As Integer 
    ’从数据库中取原始信号存入一维向量I,取其对应的碳含量存入一维向量C 
    ’m为向量I、C的元素个数 
    Call Icheck ( I , C , m ) 
    ’调用校正函数 
    End Sub 
    Private Sub Icheck (I As Variant, C As Variant, ByVal m As Integer) 
    Dim II,CC,Z As Matrix 
    Dim a0,a1,a2 As Double 
    II = zeros(m,1) 
    CC = zeros(m,1) 
    II(colon(1,m)) = I(colon(1,m)) 
    CC(colon(1,m)) =C(colon(1,m)) 
    ’多项式拟和求解 
    Z = polyfit ( II, CC, 2 ) 
    ’2 说明用二项式拟和 
    a0= Z.r1(1) ’a0为二次项系数 
    a1= Z.r1(2) ’a1为一次项系数 
    a2= Z.r1(3) ’a2为0次项系数 
    Clear axes ’清除坐标轴 
    T = Sort ( II ) 
    ’对原始信号排序,以确定作图区间 
    J = Linspace (T(1).r1(1),T(1).r(m),20) 
    ’横坐标向量 
    Cuv = plus (plus (times (a0,times (X,X) ), 
    times (a1,X) ),a2) ’纵坐标向量 
    Tmp = plot (J,Cuv) ’绘制曲线 
    Hold (“on”) 
    Tmp = plot (II, CC,“r.”) ’绘制点 
    Hold (“off”) 
    End Sub 
    执行以上代码,结果如图2所示: 总 结 
    以上几种方法对于Matlab与VB的集成都是行之有效的,但在实际应用中究竟采用哪一种方式应视具体情况而定。前两种方式比较适合 Client/Server模式,后两种方式则应视应用系统的具体要求来做选择,相比较而言,借助M文件在执行效率上略高一筹,而引入MatrixVB在 使用上更为方便。总而言之,Matlab与VB集成可大大提高开发效率,对于解决工程问题是十分有意义的。 图见: 
    http://www.ccw.com.cn/htm/app/aprog/01_12_21_2.asp 
    有问题go: 
    http://www.dytrol.com 
      

  17.   

    感激涕零阿
    多谢多谢
    今天下了个MatrixVB,正在学习中,不懂还要来麻烦大家的 :)
      

  18.   

    谢谢各位的帮助
    可惜小妹才疏学浅,MatrixVB对于矩阵的运算是没问题的
    可惜的是模式识别的算法一直没啥进展
    搞得我头都大:(我现在就想把两幅图像“对齐”了
    通过读入图像的数据来实现
    大家再来说说看法吧
      

  19.   

    http://community.csdn.net/Expert/topic/4624/4624513.xml?temp=.4787866wjj_hit(婧) ,你到这贴子的楼主的空间看看,保证你有意想不到的收获,呵呵