最近开始学习PCANET,看了半个月的代码,目前导师要我把代码中的数据集换成自己手写的字符集。于是开始查找资料,试着去做。现在此分享大家,和大家一起学习。
导师的要求具体来说就是要我在白纸上写上数据,然后在电脑上处理成数据集,每一列代表一个字符图片。如果你也有这方面的需求,但愿能帮到你。
过程如下:
首先,将手写的字符传到电脑上做处理,分割成单个图片。
做分割的matlab代码如下:
function crop_sub_image()
tic
global cnt I subImg
cnt = 1;
[FileName,PathName] = uigetfile('*.jpg');
I = imread(fullfile(PathName,FileName));
h=rgb2gray(I);
thresh=graythresh(h);
er=im2bw(h,thresh);
% 设置裁剪图像大小
%w = 20; %240
w = 20; %240
%h = 40; %240
h = 40; %240
bi=imresize(er,[200,240]);%将图片大小修改成200*240
[height,width,~]=size(bi)
%[height, width,~] = size(I);
hFig = figure('Toolbar','none','Menubar','none',...
'Name','扣样本',...
'NumberTitle','off');
% tp = get(hFig,'Position');
hIm = imshow(bi); hold on
% set(hFig,'Position',[tp(1),tp(2),width,height]);
hSP = imscrollpanel(hFig,hIm);
api = iptgetapi(hSP);
api.setMagnification(api.findFitMag()) % 图像刚好显示
iptaddcallback(gcf,'WindowButtonMotionFcn',@showSubImage);
k = waitforbuttonpress;
while k ~= 1
if k==0
name = sprintf('_%05d.jpg',cnt);
imwrite(subImg,[FileName(1:end-4),name],'jpg');
cnt = cnt+1;
end
k = waitforbuttonpress
end
close all
warndlg('结 束!')
%-----------------------------------
function showSubImage(obj,evt)
if strcmp(get(obj,'SelectionType'),'normal')
pos = get(obj,'Position');
ratio = height/pos(4);
pt = get(obj,'CurrentPoint');
y = ceil(pos(4)-pt(2));
x = ceil(pt(1));
centX = ceil(width/2 + ratio*(x-pos(3)/2));
centY = ceil(height/2 + ratio*(y-pos(4)/2));
rect = [centX-w/2,centY-h/2,w-1,h-1];
if rect(1)<0 || rect(2)<0 || rect(1)+rect(3)>width || rect(2)+rect(4)>height
return;
end
t = toc;
if t>0.1
subImg = imcrop(bi,rect);
figure(2),imshow(subImg);
tic
end
end
end
end
(这就是我分割出来的一个字符的图片)
将分割出来的图片制作成数据集.mat文件。
代码如下:
files = dir('E:\shouxiezifu1\*.jpg');%读取图片所在地方
Train=zeros(800,31); %将举证Train的数据置为0。一列代表着一副图片,因为分割出来的图片时20*40的大小,31代表我自己的图片的数目(这里根据自己的数据进行修改)
% pics = cell(length(files), 1);
for k = 1:length(files)
I = imread(['E:\shouxiezifu1\', files(k).name]);
B=I';
c=B(:);
train(:,k)=c;
end
save train %保存数据集train
可以打开这个数据集中的图片看看,输入代码:a=train(:,1);b=reshape(a,20,40);imshow(b);
这样就可以在数据集中打开一个字符图片了
希望对你们有用哈