老师让我们全班每人手写一张纸,纸上是1-9的数字,每个数字10个,以作为机器学习的训练数据。收上来的纸多种多样,且有很多干扰项(如:纸面上的阴影,纸写错的涂改,纸后面的桌面)。
由于最近有学数字图像处理,因此我用相关方法并在matlab进行处理。
为应对不同背景需手动画取ROI区域。
使用高斯滤波来去除阴影(ROI区域尽量画大)
最后使用连通域识别来分割字符
注:直接复制粘贴代码到matlab的实时脚本.mlx文件中运行
要修改图片导入地址,与用于保存切割后的图片的地址(在最后)
代码
im0_RGB = imread("img0/handwrite_22.jpg");
%im0_RGB = imread("img0/handwrite_5.jpg");
im0 = im2gray(im0_RGB);
figure
subplot(1,2,1)
imshow(im0_RGB)
subplot(1,2,2)
imhist(im0)
%选取感兴趣区域:字符所在区域
B=roipoly(im0);
B_f = logical(-1.*B +1);%负片
im0_0 = im0 .* uint8(B)+uint8(B_f).*mean(mean(im0));
%除去阴影
sigma =50;
im0_1 = imgaussfilt(im0_0,sigma);%高斯滤波
im0_2 = uint8((double(im0_0)./(0.5*(double(im0_1)+eps)))*(0.5*mean(mean(im0_1))));
figure
subplot(2,2,1)
imshow(im0_0)
subplot(2,2,2)
imshow(im0_1)
subplot(2,2,3)
imshow(im0_2)
subplot(2,2,4)
imhist(im0_2)
im0_d = double(im0_2);
mean_im = mean(mean(im0_d))
std_im = std(im0_d(:))
%imtool(im0_2)
%对比度拉伸变换
[im_hy,im_hx] = imhist(im0_2);
%[a,b]=max(im_hy)
low_in = 0;
%high_in = (b)/256;
high_in = (mean_im-std_im)/256%灰度平均值-一个标准差
%灰度变换
im1 = imadjust(im0_2,[low_in high_in]);
imshow(im1)
%imhist(im1)
%二值化
im1_d = double(im1);
mean_im1 = mean(mean(im1_d))
std_im1 = std(im1_d(:))
thresh1&