主程序:
%% 读入数据
photo=imread("airplane.tif");
figure(1);
subplot(2,3,1),imshow(photo);
%% 产生初始训练集
ob1=photo(10:17,210:217,:);
ob2=photo(20:27,50:57,:);
ob3=photo(129:136,120:127,:);
subplot(2,3,2),imshow(ob1),title("样本集1");subplot(2,3,3),imshow(ob2),title("样本集2");subplot(2,3,4),imshow(ob3),title("样本集3");
ob=[ob1 ob2 ob3];subplot(2,3,5),imshow(ob,[]);
obb=reshape(ob,1,192,3);subplot(2,3,6),imshow(obb,[]),title("重组成一行的样本集");
%% 产生训练子集
oo=1:1:192;
bb1=oo(randperm(numel(oo),150));
bb2=oo(randperm(numel(oo),150));
bb3=oo(randperm(numel(oo),150));
bb4=oo(randperm(numel(oo),150));
bb11=sample(bb1);
bb22=sample(bb2);
bb33=sample(bb3);
bb44=sample(bb4);
[fir1,fir2,fir3]=sample2(bb11,obb);
[sec1,sec2,sec3]=sample2(bb22,obb);
[thi1,thi2,thi3]=sample2(bb11,obb);
[fou1,fou2,fou3]=sample2(bb11,obb);
%% 训练线性函数
[fc1,fc2,fc3]=training(fir1,fir2,fir3);
[sc1,sc2,sc3]=training(sec1,sec2,sec3);
[tc1,tc2,tc3]=training(thi1,thi2,thi3);
[oc1,oc2,oc3]=training(fou1,fou2,fou3);
%% 分类图像
rr1=prove(photo,fc1,fc2,fc3);
rr2=prove(photo,sc1,sc2,sc3);
rr3=prove(photo,tc1,tc2,tc3);
rr4=prove(photo,oc1,oc2,oc3);
figure(4);
subplot(2,3,1),imshow(rr1,[]),title("分类器1结果");
subplot(2,3,2),imshow(rr2,[]),title("分类器2结果");
subplot(2,3,3),imshow(rr3,[]),title("分类器3结果");
subplot(2,3,4),imshow(rr4,[]),title("分类器4结果");
%% 最终分类结果
rrend=zeros(256,256);
for ri=1:256
for rj=1:256
rrend(ri,rj)=mode([rr1(ri,rj),rr2(ri,rj),rr3(ri,rj),rr4(ri,rj)]);
end
end
subplot(2,3,5),imshow(rrend,[]),title("最终结果");
程序中用到的函数--1
function [out] = sample(bb1)
green=[];
brown=[];
white=[];
for mm=1:150
if bb1(mm)<65
green=[green,bb1(mm)];
end
if bb1(mm)<129&&bb1(mm)>64
brown=[brown,bb1(mm)];
end
if bb1(mm)>128
white=[white,bb1(mm)];
end
end
out=[green,brown,white];
end
程序中用到的函数---2
function [out1,out2,out3] = sample2(x,y)
out1=[];
out2=[];
out3=[];
for i=1:150
if x(i)<65
out1=[out1,y(1,x(i),:)];
end
if x(i)<129&&x(i)>64
out2=[out2,y(1,x(i),:)];
end
if x(i)>128
out3=[out3,y(1,x(i),:)];
end
end
end
程序中用到的函数--3
function [data] = reshap4(photo)
[m,n,p]=size(photo);
x=m*n
rp=photo(:,:,1);
gp=photo(:,:,2);
bp=photo(:,:,3);
dp=photo(:,:,4);
datar=reshape(rp,x,1);
datag=reshape(gp,x,1);
datab=reshape(bp,x,1);
datad=reshape(bp,x,1);
data=[datar,datag,datab,datad];
data=double(data);
end
程序中用到的函数--4
function [w1,w2,w3] = training(yb1,yb2,yb3)
yb1(:,:,4)=1;yb2(:,:,4)=1;yb3(:,:,4)=1;
%% 训练第一个方程
w1=[1,1,1,1];%%参数向量
yybb1=[double(yb1),-double(yb2),-double(yb3),];
yybbr1=reshap4(yybb1)';
[d1,n1]=size(yybbr1);
for x1=1:100000
p1=0%计数器,小于等于0加一,一轮结束后若仍然为零可认为训练完成
for i1=1:n1
if(w1*yybbr1(:,i1))<=0
w1=w1+1.2*yybbr1(:,i1)';
p1=p1+1
else
w1=w1;
end
end
if p1==0
break;
end
end
%% 第二个
w2=[1,1,1,1];%%参数向量
yybb2=[-double(yb1),double(yb2),-double(yb3)];
yybbr2=reshap4(yybb2)';
[d2,n2]=size(yybbr2);
for x2=1:100000
p2=0%计数器,小于等于0加一,一轮结束后若仍然为零可认为训练完成
for i2=1:n2
if(w2*yybbr2(:,i2))<=0
w2=w2+1.2*yybbr2(:,i2)';
p2=p2+1
else
w2=w2;
end
end
if p2==0
break;
end
end
%% 第三个
w3=[1,1,1,1];%%参数向量
yybb3=[-double(yb1),-double(yb2),double(yb3)];
yybbr3=reshap4(yybb3)';
[d3,n3]=size(yybbr3);
for x3=1:100000
p3=0%计数器,小于等于0加一,一轮结束后若仍然为零可认为训练完成
for i3=1:n3
if(w3*yybbr3(:,i3))<=0
w3=w3+1.2*yybbr3(:,i3)';
p3=p3+1
else
w3=w3;
end
end
if p3==0
break;
end
end
end
程序中用到的函数--5
function [photo3] = prove(photo,w1,w2,w3)
photo(:,:,4)=1;
photo2=double(reshap4(photo));
result=zeros(65536,1);
for i=1:65536
dd1=w1*photo2(i,:)';
dd2=w2*photo2(i,:)';
dd3=w3*photo2(i,:)';
result(i,1)=4;
if dd1>0&dd2<0&dd3<0
result(i,1)=1;
end
if dd1<0&dd2>0&dd3<0
result(i,1)=2;
end
if dd1<0&dd2<0&dd3>0
result(i,1)=3;
end
end
photo3=reshape(result,256,256);
end
最终结果: