MATLAB纸面字符分割,字符提取

老师让我们全班每人手写一张纸,纸上是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&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值