09:48:25
该项目目前可以实现
- 图像的预处理包括:灰度化,二值化(公式假设是良好的数学公式截屏图片)
- 图像的最小外接矩求解;
- 图像的切割(part)
2021-05-02 20:24:30
Cut_Imageju:实现最小外接矩
%%实现最小外接矩的函数Cut_Imageju %column的意思是按列来排列,为行向量 %row的意思是按行来排列,为列向量 %0黑1白,字符以黑色为显示 %寻找第一个字母长度,先分割出来全部字符,之后在对分割的这些部分进行宽度处理,要不处理不了; function Img_out=Cut_Imageju(Img_in) [m,n]=size(Img_in);% x是行数,y是列数 column=sum(Img_in); %寻找左边界 left=1; num1=max(column); for i = 1 :n if column(i)~=num1 left=i; break end end %寻找右边界 right=n; for i = n :-1:1 if column(i)~=num1 right=i; break end end row=sum(Img_in,2); num2=max(row); %寻找上边界 up=1; for j = 1 :m if row(j)~=num2 up=j; break end end %寻找下边界 down=m; for j = m:-1:1 if row(j)~=num2 down=j; break end end %裁剪图像 Img_out=Img_in(up:down,left:right); end
切割字符,并且获得切割后的源量
Cut_Imageqie
%切分字符的函数Cut_Imageqie %只按列切割,切成一列列 %column的意思是按列来排列,为行向量 %row的意思是按行来排列,为列向量 %0黑1白,字符以黑色为显示 %寻找第一个字母长度,先分割出来全部字符,之后在对分割的这些部分进行宽度处理,要不处理不了; %切分字符的函数Cut_Imageqie %只按列切割,切成一列列 %%[Img_out1,Img_out2]分别代表切割下的图像和切割后的原图像 function [Img_out1,Img_out2]=Cut_Imageqie(Img_in) [m,n]=size(Img_in); column=sum(Img_in); wide=0; num1=max(column); for i = 1:n if column(i)~=num1 wide=wide+1; else newleft=i; break end end Img_out1=imcrop(Img_in,[1,1,wide,m]); Img_out2=Img_in(1:m,newleft:n); end
总函数:
%%垂直投影切割函数2 %%将之前函数片段化函数化,实现从原图像中分割字符 %%王 5/2 16点18分 %清屏 clc; close all; clear all; %读数 Img=imread('D:\data\matlabrecognizedata\rawpicture\pic2.png');%按实际路径分析 figure,subplot(1,2,1),imshow(Img),title('原图'); %灰度化和二值化 Img_Gray=rgb2gray(Img); Img_Binary=imbinarize(Img_Gray,0.57);%采用0.57做阈值; %求外接矩 Img_Cut=Cut_Imageju(Img_Binary); subplot(1,2,2),imshow(Img_Cut),title('外接矩'); %分割图像 [word1,Img_Cut]=Cut_Imageqie(Img_Cut); figure,subplot(1,3,1),imshow(word1),title('初次切'); subplot(1,3,2),imshow(Img_Cut),title('切后的原图形'); word1=Cut_Imageju(word1); subplot(1,3,3),imshow(word1),title('后切');
该项目还不能实现
- 图像的切割太过于依靠手动操作,并不能自动分析间隔,没有可以使他自动停止的标准
- 只局限于字母和单独的式子,主要是因为采取了垂直投影分割法,识别的东西一定是独体,但是像分数,根号或者其他字符的组合,就失败了,后期会考虑连通域算法;
- 不能实现识别;
严肃的东西说完了,下面说点有意思的;
1、数字图像处理的过程中,发生了很多有趣的事。一步步的攻克这些难关挺快乐的,但是千辛万苦克服之后发现这些问题那么简单,却难住了我,做出来的一瞬间,觉得自己的智慧受到了侮辱,哈哈😢;由此可见,困难来自于无知;
2、数学是严谨的,代码是数学的分支。你看我现在说的轻描淡写,可是这之中的难处只有我自己知道
- 初心太单纯(兴趣),导致唯利是图的我经常怀疑自己的判断(这么浪费时间到底对不对?)我可能烧了脑袋;
- 基础知识基本为0,matlab是伟大的,我毫不怀疑,它是人类智慧的结晶,我看着他仿佛看着海,那么大,那么远,那么不真实,数字图像处理是这无边大海的一个大洋,我对这大洋一无所知,就现在的我来说刚从港湾出来,没有经历过复杂的公式考验,没有经历过神经网络的建立,没有建立机器学习模型,没有爬取足够我使用的数据图片,而没有这些图片就没有人工智能(神经网络)。我边在海滩拾贝,边想着把梳子卖给和尚,三心二意,貌合神离。
- 不严谨。拖累我进度的一方面是思路,一方面是细节。后者占90%,我一直在debug,一个看起来完全没问题的程序完全走不通,看着几页的代码,真的是想放弃,最后发现是一些极其极其简单的问题摧毁了我(比如[]和()(又错了😔),()和(),;和;等等等等)。
- 函数嵌套要我命
我又会停几天了
enough,挺快乐的了。
祝劳动者劳动节快乐!!
探索者光荣!!