18、matlab机器学习

前提是你 提交于 2020-02-09 18:04:53

机器学习


概念

机器学习:先来看看百度百科的定义,“专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能”。可以看出,机器学习就是让机器模拟人的学习,最终目的是实现人工智能。也就是说,人们为了实现人工智能,其中的一种方式是通过机器学习。

那么,机器是怎么学习呢?简单的解释就是,人们给机器(一般指电脑)大量的数据,机器通过某种方法(算法)计算出这些数据的特征,之后机器就可以根据这些特征,来判断一个新给出的数据是什么。机器进行学习的过程就是发现数据的特征的过程。

机器进行学习的方法(算法)有很多,主要的有回归算法、神经网络、SVM(支持向量机)、聚类算法、决策树、朴素贝叶斯等等。最近非常热门的深度学习属于机器学习方法中的神经网络算法,研究者在原来的神经网络算法上进行了改进,从而形成了这个热门的深度学习的方式。深度学习的方式让机器学习达到了更高的水平。

模式识别:上面讲了什么是机器学习,那么模式识别又是什么呢?模式识别的百度解释为“对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程”。事实上,模式识别就是机器学习,在早期的工业应用中首先开始的是模式识别,后来发展到学术界就是机器学习。

早期的模式识别的方式是,人们给出某件事物的特征,电脑根据这些特征去辨认一件新东西是不是属于这个事物。由人为提取特征后交给机器,然后让机器可以根据这些特征辨认其他的东西。比如,我先给出两个大耳朵、长鼻子、四条腿、很胖这些是猪的特征,然后电脑根据这些特征,可以去分辨你新给出的一个动物是不是猪。但是这样的效果并不是很好,如果你新给出的是一匹马,但是电脑根据特征就可能也判断为是一只猪。因此在这些的基础上,机器学习做了改进,人们只需要给出一件事物,让电脑自己去发现其中的特征,寻找其中的规律,然后让电脑用这些规律去对新事物做判断。现在来说模式识别和机器学习就是等价的。

机器学习方法的分类:机器学习分为有监督学习无监督学习。有监督学习就是把分好类的事物提供给机器,机器根据不同的类别发现特征。无监督学习就是有机器自己对所有事物进行特征和规律的计算,然后将这些事物分为不同的类别。


应用

下面讲一下matlab中模式识别的一个应用——车牌识别。

车牌识别:车牌识别是模式识别中文字识别的一个重要应用,即根据已有车牌,识别出车牌的号码。


矩阵匹配(模板匹配)

矩阵匹配:首先准备多个模板,每个模板都有各自的信息。将要识别的数据和已有的多个模板进行匹配,找到匹配度最大的那一个模板,该数据的信息就是该模板的信息。

矩阵匹配的数学方法为:矩阵 AB 的点进行下面的相关性函数数学运算,得出两个矩阵的相关度,当相关度的值越接近于1,AB 的匹配度越大。

更加具体的可以去搜索皮尔森相关系数进行了解。
在这里插入图片描述

MATLAB函数实现:

r = corr2( A , B );

利用相关性函数,计算出AB的相关度,但是 AB 必须是尺寸大小相同的矩阵或图片。如果对两张尺寸不同的图片使用该函数,会出现报错。

F = imresize( F ,[ num1, num2] );

将图片尺寸大小变换成 num1×num2 。如果对两张不同大小的图片计算相关度,可以先使用该函数将图片归一化为相同大小。



1、用矩阵匹配(模板匹配)的方法实现文字识别

通过和右侧的各个模板做相关性运算,识别出左侧图片包含的文字。

在这里插入图片描述

思路

事先将右侧模板和文字建立一一对应关系,然后利用相关性函数,找到匹配度最大的模板,输出该模板对应的文字信息。

步骤

我所在目录的文件信息如下,右侧十五张模板在pic文件夹中,n.bmp为左侧要识别的图片
在这里插入图片描述

  1. 读入图片,用图片和第一张模板进行相关度运算,计算出相关度系数,保存到 r 中。
            通过计算可以得出图片和第一个模板的相关度系数,根据该思路,可以通过循环,来计算和每个图的相关度系数,从而可以找到相关度最大的模板。
    在这里插入图片描述

  2. 循环计算和每一个图做计算的相关系数的值,存到数组 R 中。
            由第一步的结果可知通过循环计算,可以得到和每个模板的相关度系数。
            为了可以循环计算和每个图的相关度系数,需要循环读入每一个图。在 imread(‘image.type’) 中的参数为字符串,由于模板图片的名字是有规律的,所以可以循环创建字符串来达到循环读入的效果。
            创建字符串可以用 strcat(‘str1’,‘str2’,…) 将多个字符串连接为一个。
            在本例中用strcat( ‘pic’ , int2str( i ) , ‘.bmp’ ),利用 i 做循环,因为 i 是整数,所以用 int2str() 转换为字符串,将整体连接成字符串读入模板图片。
            利用 R(i) 来接收和每个模板的相关度系数。
            下图我在命令行输出 R 的结果,可以看到和每个模板的相关度系数。
    在这里插入图片描述
    该步代码为:

    clc,clear,close all;
    f=imread('n.bmp');
    imshow(f);
    for i=1:15
      b=imread(strcat('pic\',int2str(i),'.bmp'));
      R(i)=corr2(f,b);
    end
    
  3. 建立模板数组,将每个图片对应到相应的文字信息。

    建立一个字符串,和模板图片的顺序对应,每个位置对应一个字符。
    利用 str=‘xxxxxxx…’ 即可创建字符串。
    该步只需新加代码:
        font=‘ABCDEFGHNVJXSMQ’;
    访问第 i 个元素使用 font( i )
    在这里插入图片描述

  4. 从计算出的 R 中找到相关系数最大的值,对应的模板数组里面的信息就是该图片的文字。
    利用 [ n, k]=max( R ) 找到 R 中最大的值,其中 n 是这个最大值, k 是该最大值的下标。
    用函数 disp( ‘xxxxx’ ) 可以在控制台输出字符串。
    在这里插入图片描述
    本例代码为:

    clc,clear,close all;
    font='ABCDEFGHNVJXSMQ';
    f=imread("n.bmp");
    imshow(f);
    for i=1:15
       b=imread(strcat('pic\',int2str(i),'.bmp'));
       R(i)=corr2(f,b);
    end
    [n,k]=max(R);
    s=strcat('这个字母是',font(k));
    disp(s);
    

2、用矩阵匹配(模板匹配)的方法实现车牌识别

对于以下车牌
在这里插入图片描述
和下面的模板
在这里插入图片描述
利用模板匹配的方式识别该车牌的内容。
思路:要想得到车牌每个字符的信息,首先要对车牌进行图片切割,然后分别对每个字符和每个模板进行匹配,找出该字符代表的信息,从而得到整个车牌的内容。

步骤:
目录的文件夹信息如下,car.jpg 是车牌图片,temp 文件夹内保存的是模板。
在这里插入图片描述

  1. 读入车牌,然后建立数组,将模板图片和文字信息对应。
    在这里插入图片描述

  2. 对车牌进行切割,得到每个字符单独的图片。这里我们选择建立一个函数来专门处理车牌的分割。matlab中建立函数的方式如下。
    在这里插入图片描述
    点击主页->新建->函数,便可建立一个函数文件,新建函数文件的默认页面如下:
    在这里插入图片描述

    function [outputArg1,outputArg2] = function-name(inputArg1,inputArg2)
    %UNTITLED2 此处显示有关此函数的摘要
    %   此处显示详细说明
    outputArg1 = inputArg1;
    outputArg2 = inputArg2;
    end
    
    • function 函数标识
    • [outputArg1,outputArg2] 函数返回参数列表,可以在函数中直接赋值代表返回值,多个参数之间用逗号隔开
    • function-name 函数名字,函数的名字要和文件的名字相同
    • (inputArg1,inputArg2) 传入参数列表,该函数需要传入的参数要在这里面声明,多个参数之间用逗号隔开
    • 两行% 表示函数的摘要和说明,在命令行用 “help 函数名” 可以显示摘要和声明
    • 下面是函数体
    • end 表示函数的结尾

    这里我们建立一个切割图片的函数:函数的注释我都在函数中标明了,因此不在进行解释,如果有不懂的可以留言交流。
    在这里插入图片描述
    函数代码:

    function [fs,num] = SplitPic(f)
    %返回值fs是一个cell型数据,每个元素保存一张分割好的图片
    %返回值num保存一共分割出了多少字符
    num=0;                  %num保存有几个区域		
    %将图片转为二值图
    g=rgb2gray(f);
    bw=imbinarize(g);
    %计算图片向下的投影累加和
    hs=sum(bw);
    %计算图片的宽度
    [~,w]=size(bw);
    s=0;                      %保存每个字符的起始位置
    b=0;                      %保存每个字符的结束位置
    i=1;                      %用i循环扫描投影和数组
    %循环切割非空白区域
    while(i<w)                %判断循环是否超出边界
        while(hs(i)==0&&i<w)  %用while让i经过空白区域
            i=i+1;
        end
        s=i;                  %s保存空白区域过后的非空白区域的第一个位置
        while(hs(i)>0&&i<w)   %让i经过非空白区域
            i=i+1;
        end
        b=i;                  %b保存非空白区域的最后一个位置后的位置
        if(s~=b) 
            x=bw(:,s:b-1);    %把二值图中横向位置为s到b-1的非空白区域分割出来
            [r,~]=find(x);    %找出纵向位置非空白区域
            num=num+1;        %每找到一个非空白区域该值加一
            fs{num}=f(min(r):max(r),s:b-1,:);   %从原图中切割出该非空区域
        end
    end
    
  3. 调用函数对图片进行切割,将切割好的图片返回给 fsnum ,fs 保存切割好的字符, num 保存一共有多少个字符。新建一个字符串,保存后面提取到的信息。
    在这里插入图片描述
    新增代码为:

    [fs,num]=SplitPic(f);
    F='';   %保存提取到的字符
    
  4. 循环处理每个分割出来的字符,计算和每个模板的相关度。因为原图是RGB图,因此切割出来的图片要先转换为二值图。由于字符图片和模板图片大小不一定相同,因此用 imresize 归一化相同大小。每个字符去和每个模板计算相关度,找到相关度最大的模板,这个模板的信息就是该字符的信息。
    在这里插入图片描述

  5. 运行程序可以得到结果
    在这里插入图片描述
    本例代码:

    clear,clc,close all;
    f=imread('car.jpg');
    imshow(f);
    font='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ京浙苏豫辽陕鲁';
    [fs,num]=SplitPic(f);
    F='';   %保存提取到的字符
    for i=1:num
        x=fs{i};
        x=rgb2gray(x);
        x=imbinarize(x);
        x=imresize(x,[40,20]);
        for j=1:43
            s=strcat('temp\',int2str(j),'.jpg');
            y=imread(s);
            y=imresize(y,[40,20]);
            R(j)=corr2(x,y);
        end
        [~,k]=max(R);
        F=strcat(F,font(k));
    end
    disp(F);
    

文章资源连接

由于图片较多,我把文件做成压缩包,上传到CSDN,我把连接放到下面了
点击这里下载

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!