主程序:
%% 读入数据
photo=imread("airplane.tif");
figure(1);
subplot(2,3,1),imshow(photo);
%% 产生训练集
yb1=photo(10:17,210:217,:);
yb2=photo(20:27,50:57,:);
yb3=photo(129:136,120:127,:);
%yb4=photo(170:177,180:187,:);
subplot(2,3,2),imshow(yb1);subplot(2,3,3),imshow(yb2);subplot(2,3,4),imshow(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
%% 带入结果
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);
figure(2),imshow(photo3,[]);
调用函数:
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
结果: