模式识别与智能感知(基于MATLAB)
-
关于图像的基本处理
- 图像的读取和保存
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双三次————用来图像插值————具体可参考[优快云](https://blog.youkuaiyun.com/bby1987/article/details/105851870) imshow(A); figure; imshow(C);
关于MATLAB figure 函数
[优快云]((102条消息) matlab figure函数的用法_ChanMon的博客-优快云博客_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的博客-优快云博客))
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);
-
实验:基于距离分类器实现人脸图片的分类
首先编程实现最近邻法,平均距离法,平均样本法,由于在学习写博客之前就已经学习了这部分内容,相关原理就不进行展示了,直接上代码:
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