跪求专家帮助,用matlab提取西红柿的颜色特征,然后识别西红柿的成熟度。
你对颜色的提取和对音频的提取是一样的。关键是把各种色标分类,这个很好做。我给你一个区分音频的源程序,是我自己编的。可以模仿一下。差不多了。基本原理是利用BP神经网络进行识别。
%%清除环境变量
色度控制中心
清楚的
%%训练数据预测数据的提取和归一化
%下载四种语音信号
加载数据1 c1
加载数据2 c2
加载数据3 c3
加载数据4 c4
% 4个特征信号矩阵被组合成一个矩阵。
data(1:500,)=c1(1:500,);
data(501:1000,)=c2(1:500,);
数据(1001:1500,)=c3(1:500,);
数据(1501:2000,)=c4(1:500,);
从1到2000随机排序的百分比
k =兰特(1,2000);
[m,n]= sort(k);
%输入和输出数据
输入=数据(:,2:25);
output1 =data(:,1);
%将输出从1维度更改为4维度。
对于i=1:2000
开关输出1(i)
案例1
output(i,)=[1 0 0];
案例2
output(i,)=[0 1 0 0];
案例3
output(i,:=[0 0 1 0];
案例4
output(i,)=[0 0 0 1];
结束
结束
%随机选取1500个样本作为训练样本,500个样本作为预测样本。
input _ train = input(n(1:1500),:)’;
output _ train = output(n(1:1500),:)';
input _ test = input(n(1501:2000),:)';
output _ test = output(n(1501:2000),:)';
输入数据标准化百分比
[inputn,inputps]= mapminmax(input _ train);
%%网络结构初始化
innum = 24
midnum = 25
out num = 4;
重量百分比初始化
w1=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,out num);
b2=rands(outnum,1);
w2 _ 1 = w2;w2 _ 2 = w2 _ 1;
w 1 _ 1 = w 1;w 1 _ 2 = w 1 _ 1;
b 1 _ 1 = b 1;b 1 _ 2 = b 1 _ 1;
B2 _ 1 = B2;B2 _ 2 = B2 _ 1;
学习率%
xite=0.1
阿尔法= 0.01;
%%网络培训
for ii=1:10
e(ii)= 0;
因为i=1:1:1500
%%网络预测输出
x=inputn(:,I);
%隐藏层输出
对于j=1:1:midnum
I(j)=inputn(:,i)'*w1(j,)'+b 1(j);
iout(j)= 1/(1+exp(-I(j));
结束
%输出层输出
yn = w2 ' * Iout '+B2;
%%重量阈值校正
%计算误差
e=output_train(:,I)-yn;
E(ii)= E(ii)+sum(ABS(E));
%计算重量变化率
dw2 = e * Iout
DB2 = e ';
对于j=1:1:midnum
s = 1/(1+exp(-I(j)));
FI(j)= S *(1-S);
结束
对于k=1:1:innum
对于j=1:1:midnum
dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
db 1(j)= FI(j)*(e(1)* w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
结束
结束
w 1 = w 1 _ 1+xite * dw 1’+alfa *(w 1 _ 1-w 1 _ 2);
b 1 = b 1 _ 1+xite * db 1 '+alfa *(b 1 _ 1-b 1 _ 2);
w2 = w2 _ 1+xite * dw2 '+alfa *(w2 _ 1-w2 _ 2);
B2 = B2 _ 1+xite * DB2 '+alfa *(B2 _ 1-B2 _ 2);
w 1 _ 2 = w 1 _ 1;w 1 _ 1 = w 1;
w2 _ 2 = w2 _ 1;w2 _ 1 = w2;
b 1 _ 2 = b 1 _ 1;b 1 _ 1 = b 1;
B2 _ 2 = B2 _ 1;B2 _ 1 = B2;
结束
结束
%%语音特征信号分类
inputn_test=mapminmax('apply ',input_test,input PS);
for ii=1:1
对于i=1:500%1500
%隐藏层输出
对于j=1:1:midnum
I(j)=inputn_test(:,i)'*w1(j,)'+b 1(j);
iout(j)= 1/(1+exp(-I(j));
结束
fore(:,I)= w2 ' * Iout '+B2;
结束
结束
%%结果分析
%根据网络输出找出数据属于哪一类。
因为i=1:500
output_fore(i)=find(fore(:,i)==max(fore(:,I));
结束
%BP网络预测误差
error = output _ fore-output 1(n(1501:2000))';
%画出预测语音类别和实际语音类别的分类图。
图(1)
plot(output_fore,' r ')
继续
plot(output 1(n(1501:2000))',' b ')
图例(“预测语音类别”、“实际语音类别”)
%绘制误差图
图(二)
绘图(误差)
标题(' BP网络分类错误',' fontsize ',12)
Xlabel('语音信号',' fontsize ',12)
Ylabel('分类错误',' fontsize ',12)
%print -dtiff -r600 1-4
k =零(1,4);
%找出误判的分类属于哪一类。
因为i=1:500
如果误差(I)~= 0
[b,c]=max(output_test(:,I));
开关c
案例1
k(1)= k(1)+1;
案例2
k(2)= k(2)+1;
案例3
k(3)= k(3)+1;
案例4
k(4)= k(4)+1;
结束
结束
结束
%找出个人和每个类别。
kk =零(1,4);
因为i=1:500
[b,c]=max(output_test(:,I));
开关c
案例1
kk(1)= kk(1)+1;
案例2
kk(2)= kk(2)+1;
案例3
kk(3)= kk(3)+1;
案例4
kk(4)= kk(4)+1;
结束
结束
正确率%
rightridio=(kk-k)。/kk