基于OpenCV的圖像輪廓提取方法的實(shí)現(xiàn)_第1頁(yè)
基于OpenCV的圖像輪廓提取方法的實(shí)現(xiàn)_第2頁(yè)
基于OpenCV的圖像輪廓提取方法的實(shí)現(xiàn)_第3頁(yè)
基于OpenCV的圖像輪廓提取方法的實(shí)現(xiàn)_第4頁(yè)
基于OpenCV的圖像輪廓提取方法的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于OpenCV的圖像輪廓提取的實(shí)現(xiàn)軟件工程專業(yè) 學(xué)生:楊榮臻 指導(dǎo)教師:孔令寅【摘 要】 OpenCV是近幾年來(lái)推出的一個(gè)開源的、免費(fèi)的計(jì)算機(jī)視覺(jué)庫(kù).OpenCV的目標(biāo)是構(gòu)建一個(gè)簡(jiǎn)單易用的計(jì)算機(jī)視覺(jué)框架,利用它所包含的函數(shù)幫助開發(fā)人員方便快捷地實(shí)現(xiàn)圖像處理和視頻處理。而圖像的輪廓是圖像的一種基本特征,攜帶著一幅圖像大部分的信息,經(jīng)常被應(yīng)用到較高層次的圖像應(yīng)用中。它在圖像分離,圖像識(shí)別和圖像壓縮等領(lǐng)域有很廣泛的應(yīng)用,也是圖像處理的基礎(chǔ)。本文首先闡述了OpenCV的特點(diǎn)和結(jié)構(gòu),然后采用一系列的可行性算法來(lái)獲取圖像特征參數(shù)并通過(guò)各種算子(Sobel算子,Laplace算子,Canny算子)對(duì)圖像的

2、灰度進(jìn)行分析,調(diào)節(jié),用實(shí)現(xiàn)對(duì)圖像的邊緣檢測(cè)和輪廓提取。【關(guān)鍵詞】 OpenCV 圖像 輪廓提取The realization of the image contour extraction based on OpenCV【Abstract】OpenCV is launched an open source in recent years.Free computer vision library. OpenCVs goal is to build a simple and easy to use computer vision framework, function to help develo

3、pers use it contains quick and easy to realize image processing and video processing.And the outline of the image is a basic feature of image, carrying an image, most of the information is often applied to the higher level of the image application.It in image separation, image recognition and image

4、compression, and other fields have a wide range of applications, is also the basis of image processing.At first, this paper expounds the characteristics and structure of OpenCV, then a series of the feasibility of the algorithm is used to obtain image feature parameters and through a variety of oper

5、ator (Sobel operator, Laplace operator, Canny operator) analysis of image gray level, adjustment, use of image edge detection and contour extraction.【Key words】 OpenCV Image Contour extraction目錄1引言1 1.1 課題背景1 1.2 研究的目的及意義1 1.3 可行性分析22 開發(fā)工具及輪廓提取概述32.1 OpenCV3 2.1.1 OpenCV簡(jiǎn)介3 2.1.2 OpenCV安裝及環(huán)境搭建32.2 邊

6、緣檢測(cè)4 2.2.1 邊緣檢測(cè)4 2.2.2 邊緣檢測(cè)原理5 2.2.3 邊緣檢測(cè)算子52.3 輪廓提取9 2.3.1輪廓提取目的9 2.3.2 輪廓提取內(nèi)容93 需求分析103.1 系統(tǒng)功能分析103.2 系統(tǒng)流程圖104 總體設(shè)計(jì)114.1 系統(tǒng)功能要求及說(shuō)明和實(shí)現(xiàn)方法114.2 系統(tǒng)功能模塊115 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)125.1 圖片提取125.2 圖像邊緣檢測(cè)155.3 圖像輪廓提取186 程序界面20總結(jié)與展望24參考文獻(xiàn)25致 謝261引言1.1 課題背景圖像處理在應(yīng)用及科研方面已經(jīng)是一個(gè)占據(jù)相當(dāng)重要地位的方向,在人們的生活中也有很廣泛的應(yīng)用,圖像表示直觀且信息豐富,是聲音和文字所不能及

7、的。在圖像處理方面很多軟件公司和科研機(jī)構(gòu)都研究了關(guān)于圖像處理的軟件。而OpenCV在計(jì)算機(jī)視覺(jué)的開發(fā)和圖像處理中扮演著重要的角色。它為計(jì)算機(jī)視覺(jué)應(yīng)用開發(fā)提供了靈活、功能強(qiáng)大的開發(fā)接口,使其成為計(jì)算機(jī)視覺(jué)專業(yè)人員所依賴的重要開發(fā)工具。它就被廣泛用在許多應(yīng)用領(lǐng)域、產(chǎn)品和研究成果中。1.2 研究目的及意義圖像處理,就是對(duì)圖像信息進(jìn)行加工來(lái)滿足人的視覺(jué)心理或應(yīng)用需求的行為。視覺(jué)是人類從大自然中獲取信息的最主要的手段。據(jù)資料統(tǒng)計(jì),人類獲取信息時(shí),視覺(jué)信息約占60,聽覺(jué)信息約占20,其他的如味覺(jué)信息、觸覺(jué)信息等約占20。可以知道視覺(jué)信息對(duì)人類的重要性,然后圖像就是人類獲取視覺(jué)信息的主要造徑。隨著科學(xué)技術(shù)的

8、發(fā)展和人民生活水平的提高,攝像機(jī)的出現(xiàn)和數(shù)字圖像處理技術(shù)的發(fā)展,在如今的數(shù)字化時(shí)代中,越來(lái)越引起人們的廣泛關(guān)注,數(shù)字圖像處理已經(jīng)成為必備的基礎(chǔ)知識(shí)。近年來(lái)由于計(jì)算機(jī)技術(shù)的蓬勃發(fā)展,圖像處理技術(shù)也得到了空前的發(fā)展和應(yīng)用。目前,圖像處理技術(shù)已經(jīng)廣泛應(yīng)用于工業(yè)、軍事、醫(yī)學(xué)、交通、農(nóng)業(yè)、天氣預(yù)報(bào)、銀行、超市、重要部門的監(jiān)控報(bào)警系統(tǒng)、可視電話、網(wǎng)絡(luò)傳輸?shù)鹊阮I(lǐng)域,就連人們?nèi)粘I钪械淖耘暮陀螒蛞埠蛨D像處理有密切的關(guān)系。本文主要是對(duì)計(jì)算機(jī)視覺(jué)系統(tǒng)的應(yīng)用,圖像輪廓提取技術(shù)進(jìn)行研究。實(shí)現(xiàn)表面缺陷的自動(dòng)檢測(cè)圖像,灰度等級(jí)自動(dòng)分選排序,提高圖像的價(jià)值有一個(gè)非常重要的作用。而影響檢測(cè)整體水平的重要方面之一是缺陷圖像的

9、處理過(guò)程,而本文研究的重點(diǎn)圖像輪廓提取技術(shù)是圖像分割、目標(biāo)區(qū)域識(shí)別區(qū)域?qū)嵺`提取等圖像分析處理領(lǐng)域的基礎(chǔ)是非常重要的。用非接觸式,精度高,能夠提供全面的分析識(shí)別方法來(lái)替代人工視覺(jué),解決圖像表面的模式識(shí)別和測(cè)量問(wèn)題,是圖像加工行業(yè)面臨的一大難題,也是值得我們長(zhǎng)期探討的科研課題。1.3 可行性分析 技術(shù)上的可行性:系統(tǒng)開發(fā)采用C+語(yǔ)言進(jìn)行程序設(shè)計(jì),運(yùn)用OpenCV強(qiáng)大的數(shù)字圖像處理技術(shù),在Windows平臺(tái)上設(shè)計(jì)圖像邊緣檢測(cè)和圖像輪廓提取的圖像處理系統(tǒng),使用VS2012的開發(fā)環(huán)境,利用QT的界面管理,給系統(tǒng)提供了高性能的保障。保障了代碼的質(zhì)量,對(duì)代碼模塊有了清晰的管,和對(duì)后期代碼的修改和擴(kuò)展提供了很

10、好的支持。綜上所述,本系統(tǒng)的設(shè)計(jì)與開發(fā)在技術(shù)上都是滿足的。經(jīng)濟(jì)上的可行性:隨著計(jì)算機(jī)的超速發(fā)展,計(jì)算機(jī)如今已是處于高配置,低價(jià)格的時(shí)代,而本系統(tǒng)的開發(fā),其應(yīng)用在游戲,教育,文藝,工業(yè)等多個(gè)領(lǐng)域有著重要的意義。本系統(tǒng)的運(yùn)行可以代替人工進(jìn)行很多繁瑣重復(fù)的工作,節(jié)省物力人力和很多資源,大大提高了生產(chǎn)效率。所以在經(jīng)濟(jì)上是可行的1。 運(yùn)行上的可行性:本系統(tǒng)作為一個(gè)小型的圖像輪廓提取系統(tǒng),所需資源無(wú)論是從硬件方面還是軟件方面都能夠滿足條件,所以在運(yùn)行上也是可行的。2開發(fā)工具及輪廓提取概述2.1 OpenCV2.1.1 程序流程圖 OpenCV 全稱 OpenSourceComputerVisionLibr

11、ary,是由Inter公司資助的開源計(jì)算機(jī)視覺(jué)庫(kù),它是用C/C+語(yǔ)言編寫的,可以實(shí)現(xiàn)圖像處理和計(jì)算機(jī)視覺(jué)中的很多算法,可以運(yùn)行在Linux/Windows/Mac等操作系統(tǒng)上。由于OpenCV的源代碼是完全開源的,并且編寫高效又簡(jiǎn)潔,很多函數(shù)都已經(jīng)匯編最優(yōu)化。所以近些年來(lái)在國(guó)內(nèi)外的圖像處理和相關(guān)領(lǐng)域中被廣泛的使用,成為了一種流行的圖像處理軟件。主要應(yīng)用領(lǐng)域有:1.人機(jī)互動(dòng)2.物體識(shí)別3.圖象分割4.人臉識(shí)別5.動(dòng)作識(shí)別6.運(yùn)動(dòng)跟蹤7.機(jī)器人等。2.1.2 OpenCV安裝及環(huán)境搭建首先把OpenCV正確的配置到VS開發(fā)環(huán)境中。設(shè)置預(yù)先編譯的頭文件的路徑與動(dòng)態(tài)鏈接庫(kù)的路徑2。第一步:安裝Open

12、CV和環(huán)境變量配置計(jì)算機(jī)- 屬性- 高級(jí)系統(tǒng)設(shè)置-環(huán)境變量加入名為OPENCV的變量,值為F:opencvbuild(這里是自己OpenCV安裝路徑),在Path變量后追加;%OPENCV%x86vc11bin(X86是32位系統(tǒng),X64是64位系統(tǒng),vc11是vc2012,vc12是2013)。第二步:在VS2012中新建項(xiàng)目建好工程后,視圖-屬性管理器,右鍵Debug,添加新項(xiàng)目屬性表,新建名為OpenCVx86.Dp的項(xiàng)目屬性表(區(qū)分Release的)。雙擊新建好的OpenCVx86.Dps屬性表,找到 常規(guī) - VC+目錄 - 包含目錄 下拉后點(diǎn)開編輯,

13、添加如下幾項(xiàng)F:opencvbuildincludeF:opencvbuildincludeopencvF:opencvbuildincludeopencv2確定后,點(diǎn)開庫(kù)目錄,編輯,追加如下2項(xiàng):F:opencvbuildx86vc11libF:opencvbuildx86vc11staticlib確定后,返回VC+目錄,找到 鏈接器 - 輸入 - 附加依賴項(xiàng)。第三步:測(cè)試是否配置成功將自己所要顯示的圖片放到工程下,新建源文件輸入以下代碼,運(yùn)行,若看到顯示圖片就說(shuō)明配置成功了!如果以后有其他新建項(xiàng)目用到OpenCV,只需要在屬性管理器頁(yè)面導(dǎo)入以上創(chuàng)建的項(xiàng)目屬性表即可!2.2 邊緣檢測(cè)2.2.

14、1 邊緣檢測(cè)計(jì)算機(jī)處理圖像有兩個(gè)目的:第一個(gè)是產(chǎn)生更加能夠讓人觀察和識(shí)別的圖像,第二個(gè)是更加能夠讓計(jì)算機(jī)自動(dòng)識(shí)別和理解圖像3??傊?,最終的目的先對(duì)大量的圖像攜帶的信息進(jìn)行分解,通過(guò)處理分解出來(lái)的最基本的基元從而來(lái)處理圖像。而邊緣檢測(cè)是計(jì)算機(jī)視覺(jué)和圖像處理中的基本問(wèn)題,邊緣檢測(cè)的目的則是標(biāo)識(shí)圖像中亮度變化明顯的點(diǎn)。圖像屬性中的顯著變化通常反映了屬性的變化。這些包括(i)深度上的不連續(xù)、(ii)表面方向不連續(xù)、(iii)物質(zhì)屬性變化和(iv)場(chǎng)景照明變化。邊緣檢測(cè)是圖像處理和計(jì)算機(jī)視覺(jué)中,尤其是特征提取中的一個(gè)研究領(lǐng)域。圖像的邊緣是圖像最基本的特征。圖像邊緣指的是周圍像素灰度有階級(jí)跳躍的變化或者屋

15、頂變換的像素的集合。邊緣的種類有兩種,我們通常把它們記作:階躍性邊緣(兩邊的灰度值有顯著的不同)和屋頂狀邊緣(存在于灰度值從增加到減少的變化轉(zhuǎn)折點(diǎn)),那么怎么分辨圖像的邊緣呢?圖像的邊緣其實(shí)就是存在在物體與物體,物體與圖像背景之間,這些都是我們能用眼睛看見的,可以從宏觀上這么說(shuō)。其實(shí)基元與基元之間都存在著邊緣,這些是微觀方面的說(shuō)話。所以這都是圖像要分割,分離的最基本的特征,我們通過(guò)尋找邊緣就能分離圖像。邊緣的種類有兩種,我們通常把它們記作:階躍性邊緣(兩邊的灰度值有顯著的不同)和屋頂狀邊緣(存在于灰度值從增加到減少的變化轉(zhuǎn)折點(diǎn))。下面是幾種類型邊緣的截面圖。 圖2-1理想躍階式 圖2-2斜降式

16、 圖2-3斜升式 圖2-4 脈沖式 圖2-5屋頂式2.2.2 邊緣檢測(cè)原理通過(guò)前面的介紹我們也大概的了解到邊緣檢測(cè)的基本概念,我們把邊緣定義為圖像中灰度發(fā)生急劇變化的局域。那么邊緣檢測(cè)的原理就能很好的理解,就是用某些已存在的算法來(lái)解決我們所要表達(dá)的問(wèn)題,更官方一點(diǎn)的話說(shuō)就是用算法提取圖像和背景之間的交界線,從而來(lái)實(shí)現(xiàn)邊緣分離和提取4。邊緣檢測(cè)算子其實(shí)也就是解決問(wèn)題的算法,這種算法自然有很多,早期的經(jīng)典算法有邊緣算子法,模擬匹配法,門限法等方法。近些年來(lái)隨著人工智能的方法,越來(lái)越多的人開始關(guān)注,于是又涌現(xiàn)了很多新的邊緣檢測(cè)算法,其中最為人多議論的有小波變換和小波包的邊緣檢測(cè)法、基于形態(tài)學(xué)和神經(jīng)網(wǎng)

17、絡(luò)的邊緣檢測(cè)法。我們可以來(lái)初步了解一下計(jì)算機(jī)是怎樣檢測(cè)圖像邊緣的。就以灰度圖像為例,它的理論基礎(chǔ)是,如果有一個(gè)邊緣,那么圖像的灰度就肯定會(huì)發(fā)生變化(為了方便假設(shè)由黑漸變?yōu)榘状硪粋€(gè)邊界),這時(shí)我們可以對(duì)其灰度分析,邊緣的灰度函數(shù)就是一個(gè)標(biāo)準(zhǔn)一次函數(shù)y=kx+b,我們對(duì)其求一階導(dǎo)數(shù)后結(jié)果就是它斜率k,也就是說(shuō)邊緣的一階導(dǎo)數(shù)是一個(gè)常數(shù),而我們又知道由于非邊緣的一階導(dǎo)數(shù)為零,這樣通過(guò)求一階導(dǎo)數(shù)就能初步判斷圖像的邊緣了5。下面先來(lái)介紹下經(jīng)典的幾種算法。(1)Roberts算子這里介紹一個(gè)名詞梯度,我們把梯度定義為一個(gè)向量(f),f指出了灰度變化最快的方向和變化量。用公式可以表示為 (2.1) 其中我們

18、可以從以前學(xué)過(guò)的數(shù)學(xué)知道它的梯度大小為 (2.2) 梯度的角度為 (2.3) 而這個(gè)Roberts算子其實(shí)就是對(duì)圖像的x(水平方向)和y(垂直方向)來(lái)趨近梯度算子。 (2.4) 我們就能得出Roberts算子的表達(dá)式為 (2.5)(2)Sobel算子 上面介紹了計(jì)算機(jī)通過(guò)y=kx+b求導(dǎo)數(shù)識(shí)別圖像邊緣的,但是在具體圖像中我們會(huì)發(fā)現(xiàn)是求不了導(dǎo)數(shù)的,因?yàn)闆](méi)有準(zhǔn)確的函數(shù)公式讓我們來(lái)求導(dǎo)數(shù),所以厲害的研究人員就想到了用另一種方式來(lái)替換原來(lái)的方式求導(dǎo)數(shù)。用一個(gè)33的二維矩陣窗口對(duì)原來(lái)圖像進(jìn)行近似求導(dǎo)。這里拿對(duì)x方向求導(dǎo)為例,如下圖2-6,我們定義b2的導(dǎo)數(shù)Ko為第三列的元素(a3,b3,c3)之和減去第

19、一列元素(a1,b1,c1)之和,這樣就求得了b2的近似導(dǎo)數(shù)。我們知道導(dǎo)數(shù)其實(shí)就是代表一個(gè)變化率,從第一列到第三列,灰度值相減,當(dāng)然就是一個(gè)變化率了。當(dāng)然Y方向?qū)?shù)與X方向?qū)?shù)求法相似,就是用第三行元素之和減去第一行元素之和。這樣一來(lái)X方向和Y方向?qū)?shù)有了,那么梯度我們也就知道了。 如果這個(gè)時(shí)候我們給每一列都加一個(gè)權(quán)重,分別為1,2,1。這就是Sobel算子了。再舉一例,如圖2-7中,求是不是邊緣點(diǎn),我們有公式得= (10*1+20*2+30*1)-(30*1+20*2+10*1)=0。由此可知不是邊緣點(diǎn)。圖2-8和圖2-9中的Gx和Gy分別為Sobel算子中水平方向和垂直方向的梯度。 圖2-

20、6 矩陣1 圖2-7 矩陣x 圖2-8水平方向梯度 圖2-9 垂直方向梯度 (3)Laplace算子 上面介紹的兩個(gè)算子都是一階差分算子,而Laplace算子是二階差分算子。我們可以想象為對(duì)一個(gè)函數(shù)的二次求導(dǎo)。我們可以想象一下,如果圖像中有噪聲(圖像在傳輸過(guò)程中的通道傳輸誤差等因素會(huì)造成圖像上出現(xiàn)一些隨機(jī)的、離散的、孤立的像素點(diǎn),就是圖像噪聲),噪聲在一階導(dǎo)數(shù)處也會(huì)取得極大值從而被當(dāng)作邊緣。如果采用二階導(dǎo)數(shù),這是函數(shù)的極大值點(diǎn)就為0了,我們就可以認(rèn)為這個(gè)點(diǎn)就是圖像的邊緣點(diǎn)了。如下圖2-10為原函數(shù),圖2-11為一階導(dǎo)數(shù),圖2-12為二階導(dǎo)數(shù)。 F(x) F(x) F(x) 圖2-10 原函數(shù)

21、圖2-11 一階導(dǎo)數(shù) 圖2-12 二階導(dǎo)數(shù) 但是Laplace算子會(huì)放大噪聲,所以我們要采用了LOG算子,就是Laplace算子,先對(duì)圖像進(jìn)行高斯模糊,抑制噪聲,再求二階導(dǎo)數(shù),二階導(dǎo)數(shù)為0的地方就是圖像的邊緣。 (4) canny算子 我從一些博客和資料中了解到了canny的原理。我們知道圖像邊緣檢測(cè)要滿足兩個(gè)條件,一是能有效的抑制噪聲;二是能精確的確定邊緣的位置。然后根據(jù)對(duì)信噪比和定位的乘積來(lái)進(jìn)行度量,得到優(yōu)化的算子,這其實(shí)就是Canny邊緣檢測(cè)算子。類似于Laplace邊緣檢測(cè)方法,先平滑后求導(dǎo)數(shù)6。我們來(lái)了解一下canny的步驟。 1.消除噪聲;在這一步中,其實(shí)就是用高斯平滑濾波器卷積降

22、低噪聲。也就是一個(gè)固定值的內(nèi)核。如下圖2-13所示。 圖2-13 5核高斯內(nèi)核 2.用一階偏導(dǎo)的有限差分來(lái)計(jì)算梯度的幅值和方向; 這一步類似于Sobel算子的求X,Y方向上的梯度。 圖2-14 水平和垂直方向上的卷積然后使用下列公式,求得梯度的幅度G和方向(一般為0,45,90,135)。 (2.6)3. 對(duì)梯度幅值進(jìn)行非極大值抑制;g1 g2 d1 C g3 d2 g4經(jīng)過(guò)上面的步驟,得到梯度并不能確定邊緣,因此我們應(yīng)該保留局部梯度最大的點(diǎn),而抑制非極大值。如果圖像梯度幅值矩陣中的元素值越大,說(shuō)明圖像中該點(diǎn)的梯度值越大,但這不不能說(shuō)明該點(diǎn)就是邊緣。在Canny算子里面,非極大值抑制是圖像邊緣

23、檢測(cè)的最重要的步驟,它的任務(wù)就是尋找像素點(diǎn)局部最大值,將非極大值點(diǎn)所對(duì)應(yīng)的灰度值置為0,這樣做就能刪除一大部分的非邊緣的點(diǎn)7。 圖2-15 非極大值抑制圖我從一篇博客上了解到了非極大值抑制的工作原理。由上圖2-15可知,要進(jìn)行非極大值抑制,以圖中c像素點(diǎn)為例,我們首先要知道像素點(diǎn)c的灰度值是否在它的8值鄰域中最大。圖中紅色的線方向我們認(rèn)為是c像素點(diǎn)的方向,我們就可以認(rèn)為它局部的最大值是分布在這條線紅色的線上的,而梯度方向的交點(diǎn)d1和d2這兩個(gè)像素點(diǎn)的值也可能是局部最大值。綜上可知,我們比較c像素點(diǎn)和這兩像素點(diǎn)的灰度就可以判斷c像素點(diǎn)的灰度值是否在它的8值鄰域中最大。如果c像素點(diǎn)灰度值最小,c像

24、素點(diǎn)不是局部最大灰度值,那么我們就可以認(rèn)定c像素點(diǎn)不是邊緣8。4.用雙閾值算法檢測(cè)和連接邊緣。這一步,Canny 采用了滯后閾值,滯后閾值需要兩個(gè)閾值,一般有三種情況作為判定是否為邊緣點(diǎn),第一如果某個(gè)像素點(diǎn)位置的幅值高于高閾值,,則該像素被保留為邊緣像素點(diǎn)。第二如果某個(gè)像素點(diǎn)的位置的幅值低于低閾值,則該像素點(diǎn)不是邊緣像素點(diǎn),移除。如果某個(gè)像素點(diǎn)的位置在高閾值和低閾值之間,則該像素點(diǎn)只在被連接到高于高閾值的像素點(diǎn)時(shí)才被保留。好吧,我們來(lái)看看OpenCV中canny算法。我們還是看看實(shí)現(xiàn)函數(shù)和其參數(shù)。void Canny(InputArray image,/輸入圖像,即源圖像OutputArray

25、 edges,/輸出邊緣圖像,需要和源圖像一樣的尺寸和類型double threshold1,/第一個(gè)滯后性閾值double threshold2,/第而個(gè)滯后性閾值int apertureSize=3,/表示應(yīng)用Sobel算子的孔徑大小,其有默認(rèn)值3bool L2gradient=false);/計(jì)算圖像梯度幅值的標(biāo)識(shí),默認(rèn)值為false2.3 輪廓提取2.3.1 輪廓提取目的為什么要對(duì)圖像進(jìn)行處理呢,在現(xiàn)實(shí)生活中其實(shí)都都能多例子,比如為了讓自拍照變得漂亮,為了更清新的看見圖片內(nèi)容,將很多照片的部分拼湊起來(lái)變成更好有價(jià)值的圖像等等。前面已經(jīng)介紹,利用計(jì)算機(jī)對(duì)圖像進(jìn)行處理,其目的就是得到更適合

26、人觀察和識(shí)別的圖像或者由計(jì)算機(jī)自動(dòng)識(shí)別和理解的圖像9。提取圖像的基本特征和屬性,用于計(jì)算機(jī)分析后就能得出自己想要的圖像,圖像的輪廓作為圖像的基本特征,經(jīng)常被應(yīng)用到較高層次的圖像應(yīng)用中去。本論文研究的圖像輪廓提取其實(shí)就是實(shí)現(xiàn)上述目的的重要的基礎(chǔ)。2.3.2 輪廓提取內(nèi)容圖像輪廓攜帶著圖像大部分信息,而輪廓存在于圖像不規(guī)則的結(jié)構(gòu)和不穩(wěn)定的像素點(diǎn),當(dāng)然也有的存在于信號(hào)的突變處。這些輪廓就是我們?cè)趫D像邊緣檢測(cè)時(shí)重要的條件和因數(shù),所以我們需要對(duì)圖像進(jìn)行邊緣檢測(cè)從而提取出圖像的輪廓出來(lái)。這些方法或者說(shuō)是算法都是我們前面說(shuō)研究過(guò)的。有時(shí)我們要把自己感興趣的東西從目標(biāo)圖像中提取出來(lái),一般用到的方法是通過(guò)顏色或

27、紋理提取出目標(biāo)圖像的前景圖,如果這是我們要對(duì)前景圖進(jìn)行分析然后把目標(biāo)提取出來(lái),這里用到的方法就是提取目標(biāo)的輪廓10。3需求分析3.1 系統(tǒng)功能分析本文主要是研究的圖像的邊緣處理技術(shù)(邊緣檢測(cè)和輪廓提?。┑囊恍┧惴?。前面我們介紹了很多經(jīng)典的圖像邊緣檢測(cè)的方法,它們是構(gòu)造對(duì)像素點(diǎn)灰度階躍變化明顯的微分算子(Sobel算子等)。這種檢測(cè)速度是非常喜人的,但是我們得到的圖像結(jié)果一般都是斷斷續(xù)續(xù)的,不怎么完整的結(jié)構(gòu)信息。可它們的優(yōu)勢(shì)在于它們對(duì)噪聲非常的敏感,一般這類算法都要對(duì)愿圖像進(jìn)行平滑操作,然后在進(jìn)行邊緣檢測(cè),這樣一來(lái)就能夠檢測(cè)出真正的圖像邊緣了。在邊緣檢測(cè)技術(shù)中比較靠譜的方法就是線性濾波器,這其實(shí)

28、就是Laplace算子。它能很好的解決頻域最優(yōu)化和空域最優(yōu)化之間的矛盾,這類算子的優(yōu)點(diǎn)在于,利用零點(diǎn)檢測(cè)中具有各向同性的特點(diǎn),保證了邊緣的封閉性。這樣處理的圖像會(huì)更加符合人眼對(duì)圖像的視覺(jué)效果。我希望利用所學(xué)的知識(shí),在VS+QT的環(huán)境中來(lái)實(shí)現(xiàn)它們,進(jìn)一步的理解它們,能使最后得到的圖像有很好的效果3.2 系統(tǒng)流程圖選取圖像打 開文 件開始圖像處理保存 目標(biāo)圖像 圖3-1 系統(tǒng)流程圖4總體設(shè)計(jì)4.1 系統(tǒng)功能要求及說(shuō)明和實(shí)現(xiàn)方法這一部分是介紹系統(tǒng)的實(shí)現(xiàn)過(guò)程,敘述系統(tǒng)的整體框架。對(duì)系統(tǒng)有一個(gè)全面的認(rèn)識(shí),將它的功能和實(shí)現(xiàn)方法有全面的了解。在功能上,我們主要有幾個(gè)要求,第一整體風(fēng)格要大方一致,結(jié)構(gòu)要清晰合

29、理,實(shí)行模塊化管理,界面要清晰,要使用戶一眼就能明白,方面用戶操作。第二要做到開發(fā)的代碼簡(jiǎn)潔,便于管理,便于修改,便于擴(kuò)充。第三,有完善的數(shù)據(jù)的輸入和輸出,容錯(cuò)性好,不會(huì)因?yàn)橛脩舻哪硞€(gè)操作造成程序的崩潰,提示多,每一步的操作都很簡(jiǎn)單明了,都能提醒用戶及時(shí)改正11。實(shí)現(xiàn)方法,我采用的是QT5.0+vs2012+OpenCV3.0的框架,選擇QT我看好的是QT5.0是一個(gè)跨平臺(tái)的C+圖形用戶界面應(yīng)用程序框架,相比原來(lái)qt5.0提升了兼容性,更加兼容OpenCV圖像處理和渲染。然而QT Create的出現(xiàn)也方便了我對(duì)代碼的編寫,很多一鍵式的操作,給用戶帶來(lái)了很多便利。使用QT也就不言而喻了。本系統(tǒng)主

30、要由MyClass類和MyClass.ui類組成。在QT中有QMainWindow提供一個(gè)有菜單條、例如工具條和一個(gè)狀態(tài)條的主應(yīng)用程序窗口,而正是我們需要的。很直觀的想法是以QMainWindow作為父類派生出MyClass類。在MyClass類中,我們實(shí)現(xiàn)了對(duì)圖像的提取,圖像格式的轉(zhuǎn)換,圖像的處理,圖像的保存,按鍵監(jiān)聽,信號(hào)槽和界面退出等操作12。當(dāng)然也是連接MyClass.ui界面類的。在實(shí)現(xiàn)過(guò)程中,完成了對(duì)MyClass類中,對(duì)各個(gè)函數(shù)的調(diào)試和修改,對(duì)代碼的注釋,對(duì)幫助提示框的修改。按鈕與實(shí)現(xiàn)功能事件一一對(duì)應(yīng),最后對(duì)程序進(jìn)行打包。4.2 系統(tǒng)功能模塊本系統(tǒng)結(jié)構(gòu)分為四個(gè)模塊,如圖4-1所示

31、。分別為:文件模塊:對(duì)圖片文件的打開,顯示在界面,圖片大小的自適應(yīng),圖片格式轉(zhuǎn)換,保存模塊:對(duì)處理后的圖片文件格式轉(zhuǎn)換,保存。邊緣檢測(cè)模塊:運(yùn)用前章節(jié)所介紹的各種算子,進(jìn)行圖片邊緣檢測(cè)。輪廓提取模塊:對(duì)圖像輪廓提取。圖像輪廓處理系統(tǒng)輪廓提取邊緣檢測(cè)保存圖片圖片提取圖4-1 系統(tǒng)模塊圖下面圖4.2每個(gè)子模塊功能圖。 圖片提取讀取圖片 路徑轉(zhuǎn)換圖片格式顯示圖片在UI上 圖4-2 圖片提取功能模塊圖 輪廓提取讀取UI上的圖片二值化處理輪廓提取輪廓標(biāo)記灰度處理 圖4-3各輪廓提取功能模塊圖5詳細(xì)設(shè)計(jì)5.1 圖片提取這個(gè)模塊首先是利用QT Create創(chuàng)建了一個(gè)名為MyClass.ui界面類,在類中添加

32、了一個(gè)按鈕PushButton。然后利用QT中的信號(hào)/槽關(guān)聯(lián)一個(gè)事件函數(shù)OpenImageClicked(),在該函數(shù)中實(shí)現(xiàn)對(duì)圖片的提取。下面為實(shí)現(xiàn)代碼。 QString fileName = QFileDialog:getOpenFileName(this,tr(Open Image), .,tr(Image Files (*.png *.jpg *.bmp); qDebug()filenames:label-setText(fileName); originalimg = image.clone(); /復(fù)制克隆原圖片qimg = MyClass:Mat2QImage(image); /轉(zhuǎn)

33、換圖片格式Mat-Qimage display(qimg); /顯示圖片在UI上來(lái)的label上 if(image.data) /根據(jù)圖片的讀取情況判斷按鈕的顯示狀態(tài) ui-pushButton-setEnabled(true);ui-pushButton_2-setEnabled(true); 5.2 圖片邊緣檢測(cè)(1)Sobel邊緣算子我們來(lái)了解一下Sobel算子在OpenCV中的實(shí)現(xiàn)吧。在OpenCV中,用Sobel這個(gè)函數(shù)來(lái)實(shí)現(xiàn)的。 void Sobel ( InputArray src,/輸入圖像 OutputArray dst,/輸出圖像 int ddepth,/輸出圖像的深度 i

34、nt dx,/x 方向上的差分階數(shù) int dy,/y 方向上的差分階數(shù) int ksize=3,/表示Sobel核的大小(如同上面看見的矩陣),默認(rèn)值為3 double scale=1,/計(jì)算導(dǎo)數(shù)值時(shí)可選的縮放因子,默認(rèn)值為1(沒(méi)有應(yīng)用縮放) double delta=0,/表示在結(jié)果存入目標(biāo)圖像之前可選的delta值,默認(rèn)值為0 int borderType=BORDER_DEFAULT );/邊界模式,默認(rèn)值為BORDER_DEFAULT 在這一個(gè)模塊中,我依然沿用了UI-MyClass 信號(hào)/槽的模式,將UI中的Sobel檢測(cè)按鈕與MyClass類中的SobelImageClicked

35、()函數(shù)相關(guān)聯(lián)。然后實(shí)現(xiàn)Sobel邊緣檢測(cè)。代碼如下。 void MyClass:SobelImage(int ,void *)/Sobel實(shí)現(xiàn)函數(shù)if(!image.empty()/原圖,原圖的灰度版,目標(biāo)圖 Mat g_srcImage, g_srcGrayImage,g_dstImage; /Sobel邊緣檢測(cè)相關(guān)變量Mat g_sobelGradient_X, g_sobelGradient_Y; Mat g_sobelAbsGradient_X, g_sobelAbsGradient_Y; int g_sobelKernelSize=1;/TrackBar位置參數(shù) g_srcImag

36、e =image;/顯示原始圖namedWindow( Sobel邊緣檢測(cè), WINDOW_AUTOSIZE ); /顯示處理后的新窗口Sobel(g_srcImage,g_sobelGradient_X,CV_16S, 1, 0, (2*g_sobelKernelSize+1), 1, 1, BORDER_DEFAULT ); / 求 X方向梯度 convertScaleAbs( g_sobelGradient_X, g_sobelAbsGradient_X );/計(jì)算絕對(duì)值,并將結(jié)果轉(zhuǎn)換成8位 Sobel(g_srcImage,g_sobelGradient_Y,CV_16S, 0, 1,

37、 (2*g_sobelKernelSize+1), 1, 1, BORDER_DEFAULT ); / 求Y方向梯度 convertScaleAbs( g_sobelGradient_Y, g_sobelAbsGradient_Y );/計(jì)算絕對(duì)值,并將結(jié)果轉(zhuǎn)換成8位 addWeighted( g_sobelAbsGradient_X, 0.5, g_sobelAbsGradient_Y, 0.5, 0, g_dstImage ); / 合并X和Y方向的梯度 imshow(Sobel邊緣檢測(cè), g_dstImage); /顯示效果圖 elseQMessageBox:information(th

38、is, tr(ERROR!), tr(please click picture!).arg();/彈出錯(cuò)誤提示框 看完代碼和注釋后,我們大概知道了Sobel的實(shí)現(xiàn)過(guò)程,下面我們來(lái)看看測(cè)試結(jié)果吧。 圖5-1 sobel邊緣檢測(cè)效果圖(2) Laplace邊緣算子現(xiàn)在我們來(lái)看看Laplace在OpenCV中是怎樣實(shí)現(xiàn)的。void Laplacian(InputArray src,/輸入圖像OutputArray dst,/輸出圖像 int ddepth,/輸出圖像的深度 int ksize=3,/表示Sobel核的大小(如同上面看見的矩陣),默認(rèn)值為3 double scale=1,/計(jì)算導(dǎo)數(shù)值時(shí)

39、可選的縮放因子,默認(rèn)值為1(沒(méi)有應(yīng)用縮放) double delta=0,/表示在結(jié)果存入目標(biāo)圖像之前可選的delta值,默認(rèn)值為0 int borderType=BORDER_DEFAULT );/邊界模式,默認(rèn)值為BORDER_DEFAULT我們可以看到在這個(gè)Laplacian函數(shù)中和Sobel參數(shù)基本相同。下面我們來(lái)看看效果怎么樣。如圖5-2。 圖5-2 Laplace邊緣檢測(cè)效果圖(3) Canny邊緣算子這個(gè)模塊的實(shí)現(xiàn)也是用的上面的模式,簡(jiǎn)單明了的實(shí)現(xiàn)了Canny邊緣算子的功能。在OpenCV中,Canny的參數(shù)與Laplace算子的參數(shù)差不多,我們來(lái)看看實(shí)現(xiàn)函數(shù)和其參數(shù)。void

40、Canny(InputArray image,/輸入圖像,即源圖像OutputArray edges,/輸出邊緣圖像,需要和源圖像一樣的尺寸和類型double threshold1,/第一個(gè)滯后性閾值double threshold2,/第而個(gè)滯后性閾值int apertureSize=3,/表示應(yīng)用Sobel算子的孔徑大小,其有默認(rèn)值3bool L2gradient=false);/計(jì)算圖像梯度幅值的標(biāo)識(shí),默認(rèn)值為false下面是實(shí)現(xiàn)代碼:void MyClass:CannyImage(int,void *)if(!image.empty()Mat g_srcImage, g_srcGray

41、Image,g_dstImage; Mat g_cannyDetectedEdges; /canny算子的原圖,二值圖,目標(biāo)圖的聲明。int g_cannyLowThreshold=20;/canny檢測(cè)處理的值,我自己設(shè)置檢測(cè)程度。 g_srcImage =image;/獲得UI上的圖片namedWindow( Canny邊緣檢測(cè), WINDOW_AUTOSIZE);/創(chuàng)建邊緣檢測(cè)處理后的新窗口 g_dstImage.create( g_srcImage.size(), g_srcImage.type() ); /創(chuàng)建與原始圖像同類型和大小的矩陣(dst) cvtColor( g_srcIm

42、age, g_srcGrayImage, CV_BGR2GRAY ); / 將原圖像轉(zhuǎn)換為灰度圖像 blur( g_srcGrayImage, g_cannyDetectedEdges, Size(3,3) ); /使用 3x3內(nèi)核來(lái)降噪 Canny(g_cannyDetectedEdges,g_cannyDetectedEdges,g_cannyLowThreshold, g_cannyLowThreshold*3, 3 );/使用canny算子處理g_dstImage = Scalar:all(0); g_srcImage.copyTo( g_dstImage, g_cannyDetect

43、edEdges); /復(fù)制處理后的圖像到目標(biāo)圖像中imshow( Canny邊緣檢測(cè), g_dstImage ); /顯示目標(biāo)圖像elseQMessageBox:information(this, tr(ERROR!), tr(please click picture!).arg();/彈出幫助提示框下面是原圖和目標(biāo)圖的對(duì)比效果: 圖5-3 Canny邊緣檢測(cè)效果圖5.3 圖像輪廓提取圖像輪廓到底是什么?有的說(shuō)輪廓就是一系列的點(diǎn),也有的說(shuō)就是圖像中的一條曲線。我們可以根據(jù)不同的表現(xiàn)方法來(lái)定義不同的圖像輪廓,就像同多種邊緣算法都能檢測(cè)出圖像的邊緣。我了解到在OpenCV中一般是用序列來(lái)存儲(chǔ)輪廓信

44、息.序列中的每個(gè)元素是就是圖像曲線的一個(gè)位置反映.只要簡(jiǎn)單把輪廓想象為使用CvSeq表示的一系列的點(diǎn)就可以了。在OpenCV中,我們用FindContours()函數(shù)進(jìn)行輪廓提取,如下圖5-4,是輪廓提取后的效果圖,可以看到在圖中我們?cè)O(shè)定為C為內(nèi)輪廓,H為外輪廓,兩種輪廓,在不同的算子實(shí)現(xiàn)方法中,就分別表示輪廓的外邊界和內(nèi)邊界。在OpenCV中我們把得到的輪廓用輪廓樹來(lái)表達(dá),從而把包含關(guān)系編碼到樹結(jié)構(gòu)中.這個(gè)圖的輪廓樹在根節(jié)點(diǎn)的輪廓叫c0,孔h00和h01是它的字子節(jié)點(diǎn).這些輪廓中直接包含輪廓稱為他們的子節(jié)點(diǎn),以此類推.不同的輪廓樹的方式,代表不同的輪廓存儲(chǔ)方式。 A CDE B H00 C0

45、 H01 H0000 C000H0001C0001C000C 圖5-4 輪廓解析圖FindContours()是圖像輪廓提取函數(shù),從二值圖像中尋找輪廓FindContours()處理圖像可以是從Canny()函數(shù)得到的有邊緣像素的圖像,或者是從Threshold()及AdaptiveThreshold()得到的圖像。我們的實(shí)現(xiàn)方法就是采用的Canny()函數(shù)得到圖像的邊緣?,F(xiàn)在我們來(lái)看看OpenCV中FindContours()函數(shù)的參數(shù)。int FindContours( CvArr* image, /image是輸入圖像,圖像必須是8位單通道圖像CvMemStorage* storage,

46、/內(nèi)存存儲(chǔ)器,cvFindContours()找到的輪廓記錄在此內(nèi)存里CvSeq* first_contour,/是指向CvSeq*的一個(gè)指針,指向輪廓樹的首地址,int header_size CV_DEFAULT(sizeof(CvContour),/存儲(chǔ)cvFindContours()更多有關(guān)對(duì)象分配的信息,可以設(shè)定為sizeof(CvContour)或者sizeof(CvChain),int mode CV_DEFAULT(CV_RETR_LIST), /計(jì)算方法,一般為四種參數(shù):CV_RETR_ExTERNAL, CV_RETR_LIST, CV_RETR_CCOMP或CV_RETR

47、_TREE.mode的值向FindeContours()說(shuō)明需要的輪廓類型,和希望的放回值形式。int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE), /怎么計(jì)算CvPoint offset CV_DEFAULT(cvPoint(0,0); 下面是在系統(tǒng)中的實(shí)現(xiàn)代碼:void MyClass:FindContours()if(!image.empty()/判斷圖片是否存在RNG rng(12345);int thresh = 100;/輪廓提取值int max_thresh = 255;/輪廓提取最大值 /原圖轉(zhuǎn)換Mat src; Mat src_gray

48、;src = image; /圖片關(guān)聯(lián)cvtColor( src, src_gray, CV_BGR2GRAY );/二值化blur( src_gray, src_gray, Size(3,3) );/除燥 / 創(chuàng)建窗體 namedWindow( 輪廓提取, WINDOW_AUTOSIZE );imshow( 輪廓提取, src );Mat canny_output;/初始化dst/定義點(diǎn)和向量 vectorvector contours;vector hierarchy;Canny( src_gray, canny_output, thresh, thresh*2, 3 );/ 用Canny

49、算子檢測(cè)邊緣,當(dāng)然也可以使用其他邊緣算子findContours(canny_output,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE, Point(0, 0) );/輪廓查找 / 繪出輪廓 Mat drawing = Mat:zeros( canny_output.size(), CV_8UC3 ); /遍歷所有頂層輪廓,隨機(jī)生成顏色值繪制給各連接組成部分for( int i = 0; i contours.size(); i+ ) Scalar color = Scalar( rng.uniform(0, 255), rng.unifo

50、rm(0,255), rng.uniform(0,255) ); /繪制填充輪廓 drawContours(drawing,contours, i, color, 2, 8, hierarchy, 0, Point() ); imshow( 輪廓提取, drawing );/ 在窗體中顯示結(jié)果elseQMessageBox:information(this, tr(ERROR!), tr(please click picture!).arg();/彈出提取框現(xiàn)在來(lái)看下效果,如圖5-5: 圖5-5 輪廓提取效果圖其中可根據(jù)canny檢測(cè)算子(也可以使用其他算子)的參數(shù)提取自己想要得到的輪廓。6 程序界面系統(tǒng)的風(fēng)格也是自己設(shè)計(jì)的,主要格調(diào)是黑色,我覺(jué)著這樣會(huì)給用戶一種非常舒適的感覺(jué),下面就是基本界面也就是主界面的截圖,如圖6-1。 圖6

溫馨提示

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

評(píng)論

0/150

提交評(píng)論