圖片文字提取系統(tǒng)的設(shè)計與實現(xiàn)【畢業(yè)設(shè)計+開題報告+文獻綜述】_第1頁
已閱讀1頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  本科畢業(yè)設(shè)計(論文)</p><p><b> ?。ǘ?屆)</b></p><p>  圖片文字提取系統(tǒng)的設(shè)計與實現(xiàn)</p><p>  所在學(xué)院 </p><p>  專業(yè)班級 計算機科學(xué)與技術(shù) </p>

2、;<p>  學(xué)生姓名 學(xué)號 </p><p>  指導(dǎo)教師 職稱 </p><p>  完成日期 年 月 </p><p>  摘要:從圖像中提取文字屬于信息智能化處理的前沿課題,是當前人工智能與模式識別領(lǐng)域中的研究熱點。

3、由于文字具有高級語義特征,對圖片內(nèi)容的理解、索引、檢索具有重要作用,因此,研究圖片文字提取具有重要的實際意義。本論文是研究基于圖片的文字提取技術(shù),通過文字定位來實現(xiàn)對位圖圖片文件中文字的提取。在讀入圖片后,通過灰度化,求水平梯度,二值化,窗口過濾等一系列處理后定位文字。本文在Windows XP環(huán)境下,以Visual C++ 6.0為開發(fā)工具,自行設(shè)計并實現(xiàn)系統(tǒng),驗證了基于C++的圖片文字提取算法。實驗結(jié)果表明:算法能夠比較準確地定位圖

4、中的文字。</p><p>  關(guān)鍵詞:圖像處理;文字定位;文字提?。晃粓D結(jié)構(gòu)</p><p>  The Design and Implementation of The Technology of Extracting Texts from Images </p><p>  Abstract: Extracting the text from images b

5、elongs to the frontier topics on intelligent information processing, and it is the current research focus in artificial intelligence and pattern recognition. As the text with high-level semantic feature and playing an im

6、portant role on understanding, indexing and retrieval of image content. Therefore, the study on extracting texts from images have important actual meanings. The paper presents a text location algorithm which localize the

7、 text in an image</p><p>  Key words: image processing; text location; text extraction; Bitmap Structure</p><p><b>  目錄</b></p><p><b>  1 引言1</b></p>

8、<p>  1.1 課題背景1</p><p>  1.2 圖片文字提取技術(shù)在國內(nèi)外的發(fā)展及現(xiàn)狀1</p><p>  1.2.1 人工文字提取的算法1</p><p>  1.2.2 場景文字提取算法2</p><p>  1.2.3 圖像邊緣檢測算法2</p><p>  1.3

9、 本課題研究的意義3</p><p>  1.4 開發(fā)平臺簡介3</p><p>  2 BMP位圖4</p><p>  2.1 位圖簡介4</p><p>  2.2 BMP位圖文件4</p><p>  2.2.1 位圖文件頭4</p><p>  2.2.2 位圖

10、信息頭5</p><p>  2.2.3 位圖顏色表6</p><p>  3 圖片文字提取算法7</p><p>  3.1 文字提取基本過程7</p><p>  3.2 文字提取算法7</p><p>  3.2.1 圖片讀入7</p><p>  3.2.2 灰度

11、化10</p><p>  3.2.3 水平梯度12</p><p>  3.2.4 二值化15</p><p>  3.2.5 文字定位17</p><p>  4 系統(tǒng)測試22</p><p>  4.1 運行界面22</p><p>  4.2 測試圖片文字提取2

12、2</p><p>  4.2.1 第一組測試22</p><p>  4.2.2 第二組測試27</p><p>  4.2.3 第三組測試30</p><p>  5 結(jié)論及展望33</p><p>  致謝錯誤!未定義書簽。</p><p><b>  參考文獻

13、34</b></p><p><b>  1 引言</b></p><p><b>  1.1 課題背景</b></p><p>  隨著計算機科學(xué)的飛速發(fā)展,以圖像為主的多媒體信息迅速成為重要的信息傳遞媒介。圖片文字的檢測與識別技術(shù)在計算機網(wǎng)絡(luò)日益發(fā)展的今天有著大量的應(yīng)用,特別是對于基于內(nèi)容的圖片或視頻

14、過濾、檢索等應(yīng)用來講,有重要意義,它可以幫助我們了解圖片內(nèi)容或者視頻內(nèi)容。文字具有高級語義特征,因此圖像中的文本是圖像內(nèi)容的一個重要來源,如果這些文本能自動地被檢測、分割、識別出來,則對圖像語義的自動理解、索引和檢索是非常有價值的。所以,研究圖片文字提取就具有了重要的實際意義。</p><p>  1.2 圖片文字提取技術(shù)在國內(nèi)外的發(fā)展及現(xiàn)狀</p><p>  1.2.1 人工文字提

15、取的算法</p><p>  (1) 為了能夠清楚地辨識出每個字的結(jié)構(gòu),文字在顏色上與其背景總是存在一定差異。因此,文字提取的實質(zhì)就是描述文字圖層與背景圖層之間的差異,并以這種差異對像素進行聚類。對彩色圖像在HSV顏色空間進行色彩聚類形成顏色圖層,再通過投影算法將顏色圖層進一步細分為子圖層進行圖層分析,最后通過子圖層合并產(chǎn)生備選文字圖層,能夠良好地從各種復(fù)雜顏色背景中提取垂直或平行于圖像邊緣的單色文字。具體方法:

16、顏色聚類;子圖層分割;圖層分析;圖層合并[1]。</p><p>  (2) 視頻文字大小自適應(yīng)提取算法基于離散傅里葉變換(discrete Fourier transform,DFT)特征、多分辨率處理及支持向量機分類技術(shù)。算法在不同分辨率下結(jié)合梯度信息、文字邊界定位技術(shù)提取出文字候選區(qū)域,然后用支持向量機對于候選圖像塊DFT特征作進一步分類。具體方法:提取候選區(qū)域;分割候選區(qū)域塊及文字邊界定位;多分辨率融合處

17、理;驗證候選塊[2]。</p><p>  (3) 彩色圖像下的文本提取方法,該方法對彩色圖像在R、G、B 三個顏色層分別進行亮度分級,以避開傳統(tǒng)顏色聚類方法的聚類數(shù)目選擇問題,降低圖像復(fù)雜度;考慮到文字筆畫的顯著方向性特征,并且通常具有穩(wěn)定的顏色,利用方向梯度算法進行文本粗定位;然后進一步利用多類SVM分類器實現(xiàn)文本區(qū)域精確判別。具體方法:亮度分級;筆畫檢測算法;SVM 精確判別[3]。</p>

18、<p>  (4) 自動提取圖像中的文本對圖像視頻檢索具有重要意義。提出了一種基于顏色和筆畫特征,應(yīng)用無監(jiān)督聚類方法進行復(fù)雜背景下的文本分割算法。首先在對文本進行圖像增強的基礎(chǔ)上,應(yīng)用顏色約減和直方圖確定文本顏色。然后提取顏色和筆畫特征,應(yīng)用k的均值聚類算法分割出文本和背景像素。最后應(yīng)用后處理優(yōu)化分割結(jié)果。具體方法:圖像增強預(yù)處理;文本顏色估計;特征提取;無監(jiān)督聚類;基于連通成分的后處理[4]。</p><

19、p>  (5) 為解決漸變色給文字提取聚類算法帶來的問題,研究與實現(xiàn)了基于二值化聚類的圖像文字提取算法。圖像通過一系列預(yù)處理后,得到了利于聚類的二值圖像,根據(jù)背景圖像區(qū)域特征,對圖像進行聚類分塊,再利用文字圖像區(qū)域特征,聚類識別出文字區(qū)域。具體方法:預(yù)處理,包括灰度化、二值化、長線剔除;文本聚類,包括背景查找、文字分割[5]。</p><p>  (6) 一種利用筆畫線條的統(tǒng)計特征基于支持向量機進行圖像中疊

20、加文字檢測的方法。該算法首先通過一種改進的線段檢測算子提取出筆畫線段;然后對筆畫線條通過區(qū)域合并定位出候選文字塊;接著對候選文字塊提取一個反映文字筆畫線條空間分布特點的32 維特征,并通過支持向量機建立的模型對候選文字塊進行確認分類。具體方法:基于筆畫線條的特征抽?。换赟VM的候選文字塊分類確認;基于筆畫線條粗定位候選文字塊[6]。</p><p>  1.2.2 場景文字提取算法</p>&l

21、t;p>  (1) 基于邊緣檢測的文本提取方法對自然場景文本的提取進行研究。通過改進彩色圖像邊緣檢測和二值邊緣圖像的形態(tài)學(xué)文本定位的算法,從而實現(xiàn)場景文本的提取。先將原始圖片進行金字塔分解,然后進行圖片預(yù)處理,對圖像進行邊緣提取和二值化,再形態(tài)學(xué)文本定位,最后文本區(qū)域字符提取[7]。</p><p>  (2) 自然環(huán)境下文本圖像背景復(fù)雜,常規(guī)閾值分割方法往往無法有效分割;基于譜聚類的圖像分割方法利用圖分割

22、理論可以有效地實現(xiàn)圖像分割,但過高的計算復(fù)雜度和空間復(fù)雜度使其在處理大圖像時不能滿足實際需求。基于灰度直方圖的譜聚類分割方法來實現(xiàn)字符提取,利用像素灰度計算相似性,在灰度直方圖上構(gòu)造相似矩陣,并通過實驗確定直方圖的理想等級數(shù)及相關(guān)參數(shù)。通過將像素級上的劃分轉(zhuǎn)化為灰度等級上的劃分,從而大大減少特征值求解時的計算量和開銷,提高算法的實用性及有效性[8]。</p><p>  1.2.3 圖像邊緣檢測算法</p

23、><p>  基于灰度直方圖的邊緣檢測,基于梯度的邊緣檢測包括Roberts邊緣算子、Sobel邊緣檢測算子、Prewitt邊緣算子、Laplacan邊緣算子,Canny邊緣檢測算子,模糊推理的邊緣檢測,Mallat小波邊緣檢測算子等[9]。</p><p>  1.3 本課題研究的意義</p><p>  靜態(tài)圖片中文本提取方面的文獻不是很豐富,之前的研究更多關(guān)注文

24、檔圖像的分析和處理。而對于復(fù)雜圖像中的文本或者嵌入圖像的文本標簽進行提取和分析研究剛剛引起人們的興趣。目前提出的紋理特征主要包括有原始像素抽樣[10]、局部方差[11]、梯度分布[12]、強邊緣的密度及方向分布等空域統(tǒng)計特征,以及小波、FFT、Gabor變換系數(shù)的統(tǒng)計特征,如矩、直方圖、共生矩陣等。通過梯度特征進行邊緣檢測,可以達到快速的定位效果,然而同時約束參數(shù)設(shè)置非常復(fù)雜,并且檢測錯誤率也很高;利用紋理特征決定像素塊是否屬于文字,可

25、以在復(fù)雜背景的條件下檢測文字信息,但是計算非常耗時,而且文字精確定位的穩(wěn)定性也不夠理想;對于視頻文字,可以利用相鄰幀的相關(guān)性大體確定字幕位置,然而這種方法不能用來處理靜態(tài)圖像。另外,基于支持向量機(SVM)分類器的多尺度定位算法也得到了廣泛的研究,雖然其檢測效果較好,但算法復(fù)雜,需事先有樣本進行學(xué)習(xí)分類器的訓(xùn)練[13]。</p><p>  1.4 開發(fā)平臺簡介</p><p>  本程

26、序的開發(fā)平臺是Visual C++[14]。C++語言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計語言,它在C語言的基礎(chǔ)上發(fā)展而來,但它比C語言更容易為人們學(xué)習(xí)和掌握。面向?qū)ο蟮脑O(shè)計思想是在原來結(jié)構(gòu)化程序設(shè)計方法基礎(chǔ)上的一個質(zhì)的飛躍,C++完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性。面向?qū)ο笤O(shè)計語言在軟件開發(fā)上有很多優(yōu)點,主要體現(xiàn)在易維護、可讀性高、質(zhì)量高、效率高、易擴展等特點上。C++的設(shè)計目標,就是要讓C++既具有適合于系統(tǒng)程序設(shè)計的C語言所具有的可適應(yīng)性和高

27、效性,又能在其程序組織結(jié)構(gòu)方面具有想Simula(Simula所支持的這種程序組織結(jié)構(gòu)通常被稱為面向?qū)ο蟪绦蛟O(shè)計風格)那樣的語言設(shè)施。C++語言同事做了很多優(yōu)化工作,使得引借自Simula的高層次的程序設(shè)計技術(shù)能夠應(yīng)用于系統(tǒng)程序設(shè)計之中。</p><p><b>  2 BMP位圖</b></p><p>  2.1 位圖簡介 </p><p&

28、gt;  位圖[15]亦稱為點陣圖像或繪制圖像,是由稱作像素(圖片元素)的單個點組成的。這些點可以進行不同的排列和染色以構(gòu)成圖樣。當放大位圖時,可以看見賴以構(gòu)成整個圖像的無數(shù)單個方塊。擴大位圖尺寸的效果是增多單個像素,從而使線條和形狀顯得參差不齊。然而,如果從稍遠的位置觀看它,位圖圖像的顏色和形狀又顯得是連續(xù)的。在體檢時,工作人員會給你一個本子,在這個本子上有一些圖像,而圖像都是由一個個的點組成的,這和位圖圖像其實是差不多的。由于每一個

29、像素都是單獨染色的,您可以通過以每次一個像素的頻率操作選擇區(qū)域而產(chǎn)生近似相片的逼真效果,諸如加深陰影和加重顏色??s小位圖尺寸也會使原圖變形,因為此舉是通過減少像素來使整個圖像變小的。同樣,由于位圖圖像是以排列的像素集合體形式創(chuàng)建的,所以不能單獨操作(如移動)局部位圖。</p><p>  2.2 BMP位圖文件 </p><p>  BMP位圖文件包括4部分,即位圖文件頭結(jié)構(gòu)BITMAP

30、FILEHEADER、位圖信息頭結(jié)構(gòu)BITMAPINFOHEADER、位圖顏色表RGBQUAD和位圖像素數(shù)據(jù),BMP位圖文件的結(jié)構(gòu)如圖2-1所示。 </p><p>  圖2-1:BMP位圖文件的結(jié)構(gòu)</p><p>  2.2.1 位圖文件頭</p><p>  位圖文件頭就是用來標志這個位圖文件一些信息比如:大小、類型等等。共有14個字節(jié)的信息。下面我們就分

31、別對這14個字節(jié)的信息分別說明一下它們所代表的意義。42 4D 為位圖的標志。如果轉(zhuǎn)換成ASCII碼的話就是BM。1E 2B 06 00 這個雙字信息代表著位圖文件的總字節(jié)數(shù),如果把它轉(zhuǎn)換化十進制的話就是(00062B1E)H=(404254)D,也就是這位圖文件的大小是404254個字節(jié)。00 00 00 00 為保留字。36 00 00 00 表示位圖陣列的起始位置,(00000036)H=(54)D,也就是從第54個字節(jié)就是這幅圖

32、的位圖陣列了。</p><p>  BMP文件頭BMP文件頭含有BMP文件的類型、文件的大小、位圖文件的保留字、位圖數(shù)據(jù)距文件頭的偏移量等信息。結(jié)構(gòu)定義如下:</p><p>  typedef struct tagBITMAPFILEHEADER</p><p><b>  {</b></p><p>  UINT b

33、fType; //位圖文件的類型,必須為BM </p><p>  DWORD bfSize; //位圖文件的大小,以字節(jié)為單位 </p><p>  UINT bfReserved1; //位圖文件保留字,必須為0 </p><p>  UINT bfReserved2; //位圖文件保留字,必須為0 </p><p>  DWORD bf

34、OffBits; //位圖數(shù)據(jù)距文件頭的偏移量,以字節(jié)為單位,表示文件起始位置到圖像數(shù)據(jù)的距離</p><p>  }BITMAPFILEHEADER;</p><p>  2.2.2 位圖信息頭</p><p>  位圖信息頭記錄著一些關(guān)于這幅圖的一些基本信息,比如:高度、寬度、分辨率等信息。28 00 00 00 表示著位圖信息頭的長度,(00000028)H

35、=(40)D,即位圖信息頭的長度占40個字節(jié)。39 01 00 00 表示位圖的寬度,(00000139)H=(313)D表示位圖的寬度為313個像素。C8 00 00 00 表示位圖的高度,(000000C8)H=(200)D表示位圖的高度為200個像素。01 00 表示位圖設(shè)備級別。00 00 00 00 表示壓縮類型,零表示不壓縮。00 00 00 00 位圖陣列表字節(jié)數(shù)。00 00 00 00 表示水平分辨率。00 00 00

36、00 表示垂直分辨率。00 00 00 00 表示位圖實際使用的顏色表中的顏色變址。00 00 00 00 表示位圖顯示過程中被認為重要顏色變址數(shù)。</p><p>  BMP位圖信息頭主要包含數(shù)據(jù)結(jié)構(gòu)的大小、圖象的高度和長度、色彩平面數(shù)、圖象數(shù)據(jù)的大小、分辨率等信息。結(jié)構(gòu)定義如下:</p><p>  typedef struct tagBIMAPINFOHEADER </p>

37、;<p><b>  { </b></p><p>  DWORD biSize; //本結(jié)構(gòu)所占用字節(jié)數(shù) </p><p>  LONG biWidth; //位圖的寬度,以像素為單位 </p><p>  LONG biHeight; //位圖的高度,以像素為單位 </p><p>  WORD biP

38、lanes; //目標設(shè)備的級別,必須為1 </p><p>  WORD biBitCount; //每個像素所需的位數(shù) </p><p>  DWORD biCompression; //位圖壓縮類型 </p><p>  DWORD biSizeImage; //位圖的大小,以字節(jié)為單位 </p><p>  LONG biXPelsP

39、erMeter; //位圖水平分辨率 </p><p>  LONG biYPelsPerMeter; //位圖垂直分辨率 </p><p>  DWORD biClrUsed; //位圖實際使用的顏色表中的顏色數(shù) </p><p>  DWORD biClrImportant; //位圖顯示過程中重要的顏色數(shù) </p><p>  } BI

40、TMAPINFOHEADER;</p><p>  2.2.3 位圖顏色表</p><p>  顏色表顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結(jié)構(gòu),且定義一種顏色,定義如下: </p><p>  typedef struct tagRGBQUAD </p><p><b>  { <

41、/b></p><p>  BYTE rgbBlue; //藍色的亮度(值范圍為0~255) </p><p>  BYTE rgbGreen; //綠色的亮度(值范圍為0~255) </p><p>  BYTE rgbRed; //紅色的亮度(值范圍為0~255) </p><p>  BYTE rgbReserved; //保留,

42、必須為0 </p><p><b>  } RGBQUAD</b></p><p> ?。?)位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下: </p><p>  typedef struct tagBITMAPINFO </p><p><b>  { </b></p&g

43、t;<p>  BITMAPINFOHEADER bmiHeader; </p><p>  RGBQUAD bmiColors[i]; </p><p>  } BITMAPINFO; </p><p>  顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個數(shù)由biBitCount來確定,當biBitCount=1、4、8時,分別有2、16、256個表項;當biBi

44、tCount=24時,沒有顏色表項。</p><p>  3 圖片文字提取算法</p><p>  3.1 文字提取基本過程</p><p>  圖像文字提取一般分為以下步驟:載入圖片,圖片處理,文字定位。文字如圖3-1所示。</p><p>  圖3-1 文字提取步驟</p><p>  3.2 文字提取算法&

45、lt;/p><p>  圖片文字提取的算法包括圖片讀入,圖片灰度化,求水平梯度,圖片二值化和圖片中文字的定位。</p><p>  3.2.1 圖片讀入</p><p>  類CxImage主要功能在于圖片的讀入,具體實現(xiàn)如下:</p><p>  //構(gòu)造一個空余空間用來存放圖片</p><p>  CxImage::

46、CxImage(DWORD imagetype)</p><p><b>  {</b></p><p>  Startup(imagetype);</p><p><b>  }</b></p><p>  //如果空間是空余的則返回true,否則返回false</p><p&

47、gt;  bool CxImage::Destroy()</p><p><b>  {</b></p><p>  if (info.pGhost==NULL){</p><p>  if (pLayers) { </p><p>  for(long n=0; n<info.nNumLayers;n++){ d

48、elete pLayers[n]; }</p><p>  free(pLayers); pLayers=0;</p><p><b>  }</b></p><p>  if (pSelection) {free(pSelection); pSelection=0;}</p><p>  if (pAlpha) {fr

49、ee(pAlpha); pAlpha=0;}</p><p>  if (pDib) {free(pDib); pDib=0;}</p><p>  return true;</p><p><b>  }</b></p><p>  return false;</p><p><b>

50、  }</b></p><p>  //構(gòu)造圖片信息函數(shù)</p><p>  CxImage::CxImage(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype)</p><p><b>  {</b></p><p>  Startup(i

51、magetype);</p><p>  Create(dwWidth,dwHeight,wBpp,imagetype);</p><p><b>  }</b></p><p>  //構(gòu)造插入圖片信息函數(shù)</p><p>  CxImage::CxImage(const CxImage &src, bool

52、copypixels, bool copyselection, bool copyalpha)</p><p><b>  {</b></p><p>  Startup(src.GetType());</p><p>  Copy(src,copypixels,copyselection,copyalpha);</p><

53、p><b>  }</b></p><p>  原始界面:如圖3-2所示。</p><p><b>  圖3-2 原始界面</b></p><p>  插入圖片:如圖3-3所示。</p><p><b>  圖3-3 插入圖片</b></p><p&g

54、t;  3.2.2 灰度化</p><p>  在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個像素只需一個字節(jié)存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。具體實現(xiàn)如下:</p><p>  //函數(shù)實現(xiàn)圖片從彩色到黑白的轉(zhuǎn)換</p><p>  HDIB DIB::ToGray(HANDLE h

55、DIB)</p><p><b>  {</b></p><p>  HDIB hNewDIB = NULL;</p><p>  LPBITMAPINFOHEADER lpSrc,lpDest;</p><p>  LPBYTE lpS,lpD;</p><p>  DWORD dwBytesP

56、erLine;</p><p>  DWORD dwImgSize;</p><p>  WORD wBytesPerLine;</p><p>  unsigned i ,j,height,width;</p><p><b>  if(!hDIB)</b></p><p>  return N

57、ULL;</p><p>  lpSrc = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p>  dwBytesPerLine = WIDTHBYTES(24*(lpSrc->biWidth));</p><p>  dwImgSize = lpSrc->biHeight * dwBytesPerLine;&l

58、t;/p><p>  //申請新的內(nèi)存,大小等于原來圖象的大小</p><p>  hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwImgSize);</p><p>  lpDest = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);</p><p>

59、  //保存圖片的長寬、顏色深度等信息</p><p>  memcpy((void*)lpDest,(void*)lpSrc,sizeof(BITMAPINFOHEADER));</p><p>  DWORD dwSBytesPerLine;</p><p>  dwSBytesPerLine = (24*(lpSrc->biWidth)+31)/32*4

60、;</p><p>  height = lpDest->biHeight;</p><p>  width = lpDest->biWidth;</p><p>  lpS = (LPBYTE)lpSrc;</p><p>  wBytesPerLine = this->BytePerLine(hDIB);</p&g

61、t;<p>  lpD = (LPBYTE)lpDest;</p><p>  lpS = lpS + sizeof(BITMAPINFOHEADER);</p><p>  lpD = lpD + sizeof(BITMAPINFOHEADER);</p><p>  unsigned r , g ,b,gray ;</p><

62、;p>  //掃描整個圖片,實現(xiàn)灰度化</p><p>  for(i = 0 ;i<height; i++)</p><p><b>  {</b></p><p>  for(j = 0 ;j<(unsigned )lpDest->biWidth;j++)</p><p><b> 

63、 {</b></p><p>  //獲得原來圖片的顏色值</p><p>  r = *(lpS++);</p><p>  g = *(lpS++);</p><p>  b = *(lpS++);</p><p><b>  //計算灰度值</b></p><

64、;p>  gray = (g*50+r*39+b*11)/100;</p><p>  //保存灰度值到目標圖片</p><p>  *(lpD++)=gray;</p><p>  *(lpD++) = gray;</p><p>  *(lpD++) = gray;</p><p><b>  }&

65、lt;/b></p><p>  //處理四字節(jié)對齊問題</p><p>  unsigned k ;</p><p>  for(k=0;k<dwSBytesPerLine-lpSrc->biWidth*3;k++)</p><p><b>  {</b></p><p>&

66、lt;b>  lpS++;</b></p><p><b>  lpD++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  GlobalUnlock(hDIB);</p><p&

67、gt;  GlobalUnlock(hNewDIB);</p><p>  return hNewDIB;</p><p><b>  }</b></p><p>  灰度化后的圖片:如圖3-4所示。</p><p>  圖3-4 灰度化后的圖片</p><p>  3.2.3 水平梯度<

68、/p><p>  圖像梯度可以把圖像看成二維離散函數(shù),圖像梯度其實就是這個二維離散函數(shù)的求導(dǎo):</p><p>  圖像梯度: G(x,y) = dx i + dy j;</p><p>  dx(i,j) = I(i+1,j) - I(i,j);//水平梯度</p><p>  dy(i,j) = I(i,j+1) - I(i,j);//垂直梯

69、度</p><p>  其中,I是圖像像素的值(如:RGB值),(i,j)為像素的坐標。</p><p>  圖像梯度一般也可以用中值差分:</p><p>  dx(i,j) = [I(i+1,j) + I(i-1,j)]/2;</p><p>  dy(i,j) = [I(i,j+1) +I(i,j-1)]/2; </p>

70、<p>  本文設(shè)計的算法是求圖像水平梯度的,具體實現(xiàn)如下:</p><p><b>  //計算圖片的梯度</b></p><p>  void DIB::GetGraient(HANDLE hGray, int type)</p><p><b>  {</b></p><p> 

71、 LPBITMAPINFOHEADER lpbi;</p><p>  int height;</p><p>  int width;</p><p>  LPBYTE lpData;</p><p><b>  int bpl;</b></p><p><b>  long off;

72、</b></p><p>  //得到圖象的基本信息</p><p>  lpbi = (LPBITMAPINFOHEADER)GlobalLock(hGray);</p><p>  height = lpbi->biHeight;</p><p>  width = lpbi->biWidth;</p>

73、<p>  bpl = this->BytePerLine(hGray);</p><p>  lpData = this->FindDIBBits(hGray);</p><p><b>  //求水平梯度</b></p><p>  if(type == 0) </p><p><b&

74、gt;  {</b></p><p>  for(int i=0;i<height;i++)</p><p>  for(int j=0;j<width-1;j++)</p><p><b>  {</b></p><p>  int off1 = this->PixelOffset(i,j

75、,bpl);</p><p>  int off2 = this->PixelOffset(i,j+1,bpl);</p><p>  lpData[off1] = abs(lpData[off2]-lpData[off1]);</p><p>  lpData[off1+1] = abs(lpData[off2+1]-lpData[off1+1]);<

76、/p><p>  lpData[off1+2] = abs(lpData[off2+2]-lpData[off1+2]);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //垂直梯度</b></p><

77、;p>  else if(type ==1)</p><p><b>  {</b></p><p>  for(int i=0;i<height-1;i++)</p><p>  for(int j=0;j<width;j++)</p><p><b>  {</b></

78、p><p>  int off1 = this->PixelOffset(i,j,bpl);</p><p>  int off2 = this->PixelOffset(i+1,j,bpl);</p><p>  lpData[off1] = abs(lpData[off2]-lpData[off1]);</p><p>  lpD

79、ata[off1+1] = abs(lpData[off2+1]-lpData[off1+1]);</p><p>  lpData[off1+2] = abs(lpData[off2+2]-lpData[off1+2]);</p><p><b>  }</b></p><p><b>  }</b></p>

80、<p><b>  //兩者都要</b></p><p>  else if(type ==2)</p><p><b>  {</b></p><p><b>  }</b></p><p>  GlobalUnlock(hGray);</p>

81、<p><b>  }</b></p><p>  水平梯度后的圖片:如圖3-5所示。</p><p>  圖3-5 水平梯度后的圖片</p><p>  3.2.4 二值化</p><p>  圖像的二值化處理將圖像上的像素點的灰度值設(shè)置為0或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果。將256個亮度等級

82、的灰度圖像通過適當?shù)拈y值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。所有灰度大于或等于閥值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。具體實現(xiàn)如下:</p><p>  //實現(xiàn)圖片的黑白二值化</p><p>  void DIB::WhiteBlack(HANDLE hDIB,unsigned

83、n)</p><p><b>  {</b></p><p>  LPBITMAPINFOHEADER lpbi;</p><p>  LPBYTElpS;</p><p>  intwidth,height;</p><p>  longlOffset;</p>&l

84、t;p>  WORD wBytesPerLine;</p><p><b>  if(!hDIB)</b></p><p><b>  return ;</b></p><p>  wBytesPerLine = this->BytePerLine(hDIB);</p><p>

85、  lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p>  //得到圖片的長寬信息</p><p>  width = lpbi->biWidth;</p><p>  height = lpbi->biHeight;</p><p>  lpS = (LPBYTE)lpbi;

86、</p><p>  //lps指向數(shù)據(jù)區(qū)</p><p>  lpS = lpS + sizeof(BITMAPINFOHEADER);</p><p>  //掃描整個圖片,實現(xiàn)二值化</p><p>  for(int i = 0;i<height;i++)</p><p>  for(int j = 0

87、;j<width;j++)</p><p>  { //得到象素數(shù)據(jù)在數(shù)據(jù)區(qū)中的偏移</p><p>  lOffset = this->PixelOffset(i,j,wBytesPerLine);</p><p>  if(*(lpS+lOffset)<n)//象素值小于臨界值</p><p>  { //把象素

88、填充為黑色</p><p>  *(lpS+lOffset++) = 0;</p><p>  *(lpS+lOffset++) = 0;</p><p>  *(lpS+lOffset) = 0;</p><p><b>  }</b></p><p>  else //象素值大于臨界值&l

89、t;/p><p><b>  { </b></p><p>  //把象素填充為白色</p><p>  *(lpS+lOffset++) = 255;</p><p>  *(lpS+lOffset++) = 255;</p><p>  *(lpS+lOffset) = 255;</

90、p><p><b>  }</b></p><p><b>  }</b></p><p>  GlobalUnlock(hDIB);</p><p><b>  }</b></p><p>  二值化后的圖片:如圖3-6所示。</p><

91、;p>  圖3-6 二值化后的圖片</p><p>  3.2.5 文字定位</p><p>  圖片經(jīng)二值化后,會呈現(xiàn)黑白分明的兩部分,文字一般集中在白色區(qū)域。本文提供的文字定位方法就是產(chǎn)生一個矩形框,矩形框逐步移動,找出文字集中區(qū)域。具體實現(xiàn)如下:</p><p><b>  //圖片文字定位</b></p><

92、p>  int DIB::LocateText(HANDLE hDIB, CRect &rect)</p><p><b>  {</b></p><p><b>  //灰度化</b></p><p>  this->Togray(hDIB);</p><p><b>

93、;  //求梯度</b></p><p>  this->GetGraientForFrame(hDIB,0);</p><p><b>  //二值化</b></p><p>  this->WhiteBlack(hDIB,25);</p><p>  LPBITMAPINFOHEADER lp

94、bi;</p><p>  lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p>  int h = lpbi->biHeight;</p><p>  int w = lpbi->biWidth;</p><p>  int bpl = this->BytePerLine

95、(hDIB);</p><p>  LPBYTE lpData = this->FindDIBBits(hDIB);</p><p><b>  //調(diào)整矩形框的寬</b></p><p>  const int windW = w*1/3;</p><p><b>  //調(diào)整矩形框的高</b&g

96、t;</p><p>  const int windH = h/8;</p><p>  int max_i=-1,max_j;</p><p>  int max_v=0;</p><p><b>  //過濾</b></p><p>  for(int i=0;i<h-windH-1

97、;i+=2)</p><p>  for(int j=150;j<w-windW-5;j+=3)</p><p><b>  {</b></p><p>  rect.top = i;</p><p>  rect.bottom = rect.top+windH;</p><p>  re

98、ct.left = j;</p><p>  rect.right = rect.left+windW;</p><p><b>  int temp;</b></p><p>  //計算當前窗口中的白點個數(shù)</p><p>  temp = RectCal(lpData,rect,bpl);</p>&

99、lt;p>  //當前窗口中的白點更多</p><p>  if(temp >windH*windW*0.05 && temp > max_v)</p><p><b>  {</b></p><p>  max_i = i;</p><p>  max_j = j;</p>

100、<p>  max_v = temp;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(max_i !=-1)</p><p><b>  {</b></p><p>  rect

101、.top = max_i;</p><p>  rect.bottom =max_i+windH-1;</p><p>  rect.left =max_j;</p><p>  rect.right = rect.left + windW-1;</p><p><b>  //區(qū)域收縮</b></p>&

102、lt;p><b>  //上邊界逼近</b></p><p>  for(int i=rect.top;i<rect.bottom;i++)</p><p><b>  {</b></p><p>  int count=0;</p><p>  for(int j=rect.left

103、;j<rect.right;j++)</p><p><b>  {</b></p><p>  int off = this->PixelOffset(i,j,bpl);</p><p>  if(lpData[off] == 255)</p><p><b>  count++;</b&g

104、t;</p><p><b>  }</b></p><p>  //接觸點達到一定個數(shù)</p><p>  if(count > (rect.right-rect.left)*0.05)</p><p><b>  break;</b></p><p><b&g

105、t;  }</b></p><p>  int top = i;</p><p>  //從底部向上,尋到下邊界</p><p>  for( i=rect.bottom;i>rect.top;i--)</p><p><b>  {</b></p><p>  int cou

106、nt=0;</p><p>  for(int j=rect.left;j<rect.right;j++)</p><p><b>  {</b></p><p>  int off = this->PixelOffset(i,j,bpl);</p><p>  if(lpData[off] == 255)&

107、lt;/p><p><b>  count++;</b></p><p><b>  }</b></p><p>  //接觸點達到一定個數(shù)</p><p>  if(count > (rect.right-rect.left)*0.05)</p><p><b>

108、;  break;</b></p><p><b>  }</b></p><p>  int bottom =i;</p><p><b>  //尋找左邊界</b></p><p>  for( int j=rect.left;j<rect.right;j++)</p&g

109、t;<p><b>  {</b></p><p>  int count =0;</p><p>  for(int i=rect.top;i<rect.bottom;i++)</p><p><b>  {</b></p><p>  int off = this->P

110、ixelOffset(i,j,bpl);</p><p>  if(lpData[off] == 255)</p><p><b>  count++;</b></p><p><b>  }</b></p><p>  //遇到兩白點,則停止</p><p>  if(co

111、unt >2)</p><p><b>  break;</b></p><p><b>  }</b></p><p>  int left = j;</p><p>  for( j=rect.right;j>rect.left;j--)</p><p>&l

112、t;b>  {</b></p><p>  int count =0;</p><p>  for(int i=rect.top;i<rect.bottom;i++)</p><p><b>  {</b></p><p>  int off = this->PixelOffset(i,j,

113、bpl);</p><p>  if(lpData[off] == 255)</p><p><b>  count++;</b></p><p><b>  }</b></p><p>  if(count >2)</p><p><b>  break;&

114、lt;/b></p><p><b>  }</b></p><p>  int right = j;</p><p>  rect.top = top;</p><p>  rect.bottom = bottom;</p><p>  rect.left = left;</p>

115、;<p>  rect.right =right;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b>

116、</p><p>  圖片文字定位:如圖3-7所示。</p><p>  圖3-7 圖片文字定位</p><p><b>  4 系統(tǒng)測試</b></p><p><b>  4.1 運行界面</b></p><p>  程序運行后的界面:如圖4-1所示。</p&g

117、t;<p><b>  : </b></p><p><b>  圖4-1 原始界面</b></p><p>  4.2 測試圖片文字提取 </p><p>  4.2.1 第一組測試</p><p>  第一組測試,用于測試圖片中文字能完全定位的:</p><

118、p>  打開第一張圖片:如圖4-2所示。</p><p>  定位文字的矩形框為寬度windW = w*1/4,高度windH = h/3。</p><p>  圖4-2 第一張圖片</p><p>  灰度化:如圖4-3所示。</p><p><b>  圖4-3 灰度化</b></p><p

119、>  水平梯度:如圖4-4所示。</p><p><b>  圖4-4 水平梯度</b></p><p>  二值化:如圖4-5所示。</p><p><b>  圖4-5 二值化</b></p><p>  文字定位:如圖4-6所示。</p><p><b>

120、;  圖4-6 文字定位</b></p><p>  打開第二張圖片:如圖4-7所示。</p><p>  定位文字的矩形框為寬度windW = w*1/2,高度windH = h/2。</p><p>  圖4-7 第二張圖片</p><p>  文字定位:如圖4-8所示。</p><p><b&g

121、t;  圖4-8 文字定位</b></p><p>  打開第三張圖片:如圖4-9所示。</p><p>  定位文字的矩形框為寬度windW = w*1/3,高度windH = h/6。</p><p>  圖4-9 第三張圖片</p><p>  文字定位:如圖4-10所示。</p><p>  圖4-

122、10 文字定位</p><p>  4.2.2 第二組測試</p><p>  第二組測試,用于測試圖片中文字不能完全定位的:</p><p>  打開第一張圖片:如圖4-11所示。</p><p>  定位文字的矩形框為寬度windW = w*1/3,高度windH = h/6。</p><p>  圖4-11 第

123、一張圖片</p><p>  文字定位:如圖4-12所示。</p><p>  圖4-12 文字定位</p><p>  打開第二張圖片:如圖4-13所示。</p><p>  定位文字的矩形框為寬度windW = w*1/3,高度windH = h/3。</p><p>  圖4-13 第二張圖片</p>

124、<p>  文字定位:如圖4-14所示。</p><p>  圖4-14 文字定位</p><p>  4.2.3 第三組測試</p><p>  第三組測試,用于測試圖片中文字定位錯誤的:</p><p>  打開第一張圖片:如圖4-15所示。</p><p>  定位文字的矩形框為寬度windW =

125、 w*1/2,高度windH = h/3。</p><p>  圖4-15 第一張圖片</p><p>  文字定位:如圖4-16所示。</p><p>  圖4-16 文字定位</p><p>  打開第二張圖片:圖4-17所示。</p><p>  定位文字的矩形框為寬度windW = w*1/2,高度windH

126、= h/3。</p><p>  圖4-17 第二張圖片</p><p>  文字定位:如圖4-18所示。</p><p>  圖4-18 文字定位</p><p><b>  5 結(jié)論及展望</b></p><p>  隨著多媒體技術(shù)和網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,以圖像、音頻和視頻為主的多媒體信息大量

127、涌現(xiàn),為了實現(xiàn)對多媒體信息的高效訪問,多媒體處理和檢索工具的開發(fā)就成了當務(wù)之急。而圖像中的文字包含了高層的語義信息,是理解圖像內(nèi)容的重要線索,因此,檢測和識別圖像中所含的文字是進行圖像檢索的有效手段,而圖像中的文字提取技術(shù)也隨之成為多媒體分析領(lǐng)域的研究熱點。</p><p>  本文對圖片中的文字提取算法進行了系統(tǒng)的研究,并在對算法的深入研究中設(shè)計實現(xiàn)了一個靜態(tài)圖片中文字提取的系統(tǒng)。在閱讀一定量的參考文獻的基礎(chǔ)上

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論