模式识别与智能感知(基于MATLAB)

  1. 关于图像的基本处理

    • 图像的读取和保存
    A =imread('0-1.jpg')
    imwrite(A,'0.jpg')
    
    • 图像的显示
    A = imread('0-1,jpg');
    [M,N,P]=size(A);%图像的行数,列数,通道数
    imshow(A);
    
    • 图像的缩放
    A = imread('0-1,jpg');
    C = imresize(A,0.5,'bilinear');%method指定的缩放方法:nearest最近邻,bilinear双线性,bicubic双三次————用来图像插值————具体可参考[CSDN](https://blog.csdn.net/bby1987/article/details/105851870)
    imshow(A);
    figure;
    imshow(C);
    

    关于MATLAB figure 函数

    [CSDN]((102条消息) matlab figure函数的用法_ChanMon的博客-CSDN博客_matlabfigure用法)


    • 图像的旋转

      A = imread('0-1.jpg');
      D = imrotate(A,30,'bilinear');%逆时针旋转30度
      D1 = imrotate(A,60,'bilinear');
      figure
      subplot(3,1,1),imshow(A);
      subplot(3,1,2),imshow(D);
      subplot(3,1,3),imshow(D1);
      
    • 图像的灰度化(与二值化不同,详情见((102条消息) (二)对图像进行预处理(灰度化,二值化)_AgentPotato的博客-CSDN博客))

      A = imread('0-1.jpg');
      E = rgb2gray(A);%Gray=0.299R+0.587G+0.114B
      figure
      subplot(2,1,1),imshow(A);
      subplot(2,1,2),imshow(E);
      
    • 图像矩阵转换成向量

      A = imread('0-1,jpg');
      E = rgb2gray(A);
      [M,N] = size(E);
      vector = reshape(E,M*N,1);%reshape(A,m,n)将A 的行列排列成m行n列
      

      作业:

      **作业1:**将制作的人脸图片压缩为64*64的图并保存

      **作业2:**读取1张图片,将图片灰度化并转换为向量

      A = imread('0-1.png');
      [M, N, P] = size(A); 
      B = rgb2gray(A);
      C =imresize(B,[64,64]);
      figure
      subplot(3,1,1);imshow(A);
      subplot(3,1,2);imshow(B);
      subplot(3,1,3);imshow(C);
      
      imwrite(C,'1.png');
      [M, N, P] = size(C); 
      vector = reshape(C,M*N,1);
      
      
    1. 实验:基于距离分类器实现人脸图片的分类

      首先编程实现最近邻法,平均距离法,平均样本法,由于在学习写博客之前就已经学习了这部分内容,相关原理就不进行展示了,直接上代码:

      clear all;clc;
      T1=[1;2];T2=[2;1];
      T3=[3;5];T4=[4;4];
      X=[4;3];
      d1=sqrt((T1-X)'*(T1-X));
      d2=sqrt((T2-X)'*(T2-X));
      d3=sqrt((T3-X)'*(T3-X));
      d4=sqrt((T4-X)'*(T4-X));
      
      A1=[d1,d2,d3,d4];
      [m_1,m1]=min(A1);
      m_1
      if m1<3
          fprintf('最近邻法得到X属于类别1');
      else
          fprintf('最近邻法得到X属于类别2\r\n');
      end
      
      A2=[(d1+d2)/2,(d3+d4)/2];
      [m_2,m2]=min(A2);
      m_2
      if m2==1
          fprintf('平均距离法得到X属于类别1');
      else
          fprintf('平均距离法得到X属于类别2\r\n');
      end
      
      T_11=(T1+T2)/2;T_22=(T3+T4)/2;
      d_11=sqrt((T_11-X)'*(T_11-X));
      d_22=sqrt((T_22-X)'*(T_22-X));
      A3=[d_11,d_22];
      [m_3,m3]=min(A3);
      m_3
      if m3==1
          fprintf('平均样本法得到X属于类别1');
      else
          fprintf('平均样本法得到X属于类别2\r\n');
      end
      

      之后嘞,要用已知的5个2维样本,用上面的三种方法计算,实现人脸图片的分类,因为课代表要的紧,没空写博客了,直接上代码:

      clear all;clc;
      %因为imread读入源图像为三维,所以不能进行D=A*X*A'。必须对读取的图像做I=im2double(I)。函数im2double将输入转换成double类型。
      A1 = imread('1.png');A1=im2double(A1);vector1 = reshape(A1,4096,1);
      A2 = imread('2.png');A2=im2double(A2);vector2 = reshape(A2,4096,1);
      A3 = imread('3.png');A3=im2double(A3);vector3 = reshape(A3,4096,1);
      A4 = imread('4.png');A4=im2double(A4);vector4 = reshape(A4,4096,1);
      A5 = imread('5.png');A5=im2double(A5);vector5 = reshape(A5,4096,1);
      
      %A1,A3是类别1-吴京
      %A2,A5是类别2-张嘉译
      %A4是测试样本,真实是吴京
      % T1=[1;2];T2=[2;1];
      % T3=[3;5];T4=[4;4];
      % X=[4;3];
      d1=sqrt((vector1-vector4)'*(vector1-vector4));
      d2=sqrt((vector3-vector4)'*(vector3-vector4));
      d3=sqrt((vector2-vector4)'*(vector2-vector4));
      d4=sqrt((vector5-vector4)'*(vector5-vector4));
      
      A1=[d1,d2,d3,d4];
      [m_1,m1]=min(A1);
      m_1
      if m1<3
          fprintf('最近邻法得到X属于类别1');
      else
          fprintf('最近邻法得到X属于类别2\r\n');
      end
      
      A2=[(d1+d2)/2,(d3+d4)/2];
      [m_2,m2]=min(A2);
      m_2
      if m2==1
          fprintf('平均距离法得到X属于类别1');
      else
          fprintf('平均距离法得到X属于类别2\r\n');
      end
      
      T_11=(vector1+vector3)/2;T_22=(vector2+vector5)/2;
      d_11=sqrt((T_11-vector4)'*(T_11-vector4));
      d_22=sqrt((T_22-vector4)'*(T_22-vector4));
      A3=[d_11,d_22];
      [m_3,m3]=min(A3);
      m_3
      if m3==1
          fprintf('平均样本法得到X属于类别1');
      else
          fprintf('平均样本法得到X属于类别2\r\n');
      end
      
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐