基於MATLAB公式識別

尼各馬可倫理學發表於2021-05-02

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,挺快樂的了。

祝勞動者勞動節快樂!!

探索者光榮!!

 

相關文章