经过前几周的学习,学习步入正轨,通过阅读书籍和网上查询基本上学会了使用matlab软件。老师让我们自己找方向,但是前段时间有点迷茫,着实浪费了不少时间。
1、下面为BP神经网络训练的代码:
function [XALL,yALL ] = BuildDataSet( )
%从存放正度样本图片的文件夹中构造正负样本集
for i=1:156
%读取图像
image_toRead_name=strcat('F:\学\matlab\风机桨叶样本及代码\标准清晰截图(正)\test (',num2str(i),')');
image_toRead_name=strcat(image_toRead_name,'.png');
%读取图像
OriImage=imread(image_toRead_name);
OriImage=double(OriImage)/255;
%处理图像
OriImage=imresize(OriImage,[25 25]);
%灰度矩阵转列向量(逐列扫描)
XALL(:,i)=reshape(OriImage,625,1);
yALL(:,i)=1;
end
for i=1:967
%读取图像
image_toRead_name=strcat('F:\学\matlab\风机桨叶样本及代码\标准清晰截图(负)\test (',num2str(i),')');
image_toRead_name=strcat(image_toRead_name,'.png');
%读取图像
OriImage=imread(image_toRead_name);
OriImage=double(OriImage)/255;
%处理图像
OriImage=imresize(OriImage,[25 25]);
%灰度矩阵转列向量(逐列扫描)
XALL(:,i+156)=reshape(OriImage,625,1);
yALL(:,i+156)=0;
end
XALL=XALL';
yALL=yALL';
end
使用BP神经网络识别绝缘子,BP神经网络需要手动寻找正样图片大小,样本是手动截取的大小不定,在用imread读取图像之后,需要用imresize来规范图片大小。
2、在后选出结果的阶段,运用了滑窗算法,算法如下:
function [ ] = temp(image_toRead_name)
%给一幅图像的路径,对这幅图像进行识别
%读取图像
image=imread(image_toRead_name);
% image=rgb2gray(image);
image=double(image)/255;
imagelong=size(image,2);
imagewidth=size(image,1);
location=[];
for width=54:60
for i=1:7:imagewidth-width
for j=1:7:imagelong-width
tempImage=image(i:i+width-1,j:j+width-1);
%灰度矩阵转列向量(逐列扫描)
tempImage=Resize(tempImage, 25,25 );
X=reshape(tempImage,25*25,1);
result=PredictNewData( X');
if result>=0.8
location=[location;i,j,i+width,j+width,result];
end
end
end
end
index=nms(location, 0.1);
location=location(index,:);
for num=1:size(location,1)
x=location(num,1);
y=location(num,2);
width=location(num,3)-x;
for ii=x:x+width
image(ii,y)=1;
image(ii,y+width)=1;
end
for jj=y:y+width
image(x,jj)=1;
image(x+width,jj)=1;
end
end
% A=image(x:x+width,y:y+width);
% temp1(A,image_toRead_name);
% imshow(A);
% 保存图像
image_toSave_name=strcat(image_toRead_name,'识别结果(8)');
image_toSave_name=strcat(image_toSave_name,'.jpg');
% image_toSave_name=' F:\绝缘子2.0\绝缘子均衡化后的大图\';
% image_toSave_name=strcat(image_toSave_name,num2str(k),'.jpg');
imwrite(image,image_toSave_name);
%
end
滑窗算法存在的问题:因训练样本不足,图像处理不是很好,不能全部识别不出绝缘子,总是有所遗漏就如这样
;
有的更会识别错误,就如这样:
由于程序决定,识别图片所花时间会随图片的大小而发生变化,图片越大花费时间越长,效率越多。
改进想法:1、寻找新的算法;2、更改滑窗的循环方式以减小花费时间,3、在不减少图片特征的情况下减小图片的大小。