




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、基于opencv的圖像輪廓提取的實現(xiàn)軟件工程專業(yè) 學生: 指導教師:【摘 要】 opencv是近幾年來推出的一個開源的、免費的計算機視覺庫.opencv的目標是構建一個簡單易用的計算機視覺框架,利用它所包含的函數(shù)幫助開發(fā)人員方便快捷地實現(xiàn)圖像處理和視頻處理。而圖像的輪廓是圖像的一種基本特征,攜帶著一幅圖像大部分的信息,經(jīng)常被應用到較高層次的圖像應用中。它在圖像分離,圖像識別和圖像壓縮等領域有很廣泛的應用,也是圖像處理的基礎。本文首先闡述了opencv的特點和結構,然后采用一系列的可行性算法來獲取圖像特征參數(shù)并通過各種算子(sobel算子,laplace算子,canny算子)對圖像的灰度進行分析
2、,調(diào)節(jié),用實現(xiàn)對圖像的邊緣檢測和輪廓提取?!娟P鍵詞】 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 developers u
3、se 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 compre
4、ssion, 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 operator (
5、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簡介3 2.1.2 opencv安裝及環(huán)境搭建32.2 邊緣檢測4 2
6、.2.1 邊緣檢測4 2.2.2 邊緣檢測原理5 2.2.3 邊緣檢測算子52.3 輪廓提取9 2.3.1輪廓提取目的9 2.3.2 輪廓提取內(nèi)容93 需求分析103.1 系統(tǒng)功能分析103.2 系統(tǒng)流程圖104 總體設計114.1 系統(tǒng)功能要求及說明和實現(xiàn)方法114.2 系統(tǒng)功能模塊115 詳細設計與實現(xiàn)125.1 圖片提取125.2 圖像邊緣檢測155.3 圖像輪廓提取186 程序界面20總結與展望24參考文獻25致 謝261引言1.1 課題背景圖像處理在應用及科研方面已經(jīng)是一個占據(jù)相當重要地位的方向,在人們的生活中也有很廣泛的應用,圖像表示直觀且信息豐富,是聲音和文字所不能及的。在圖像處
7、理方面很多軟件公司和科研機構都研究了關于圖像處理的軟件。而opencv在計算機視覺的開發(fā)和圖像處理中扮演著重要的角色。它為計算機視覺應用開發(fā)提供了靈活、功能強大的開發(fā)接口,使其成為計算機視覺專業(yè)人員所依賴的重要開發(fā)工具。它就被廣泛用在許多應用領域、產(chǎn)品和研究成果中。1.2 研究目的及意義圖像處理,就是對圖像信息進行加工來滿足人的視覺心理或應用需求的行為。視覺是人類從大自然中獲取信息的最主要的手段。據(jù)資料統(tǒng)計,人類獲取信息時,視覺信息約占60,聽覺信息約占20,其他的如味覺信息、觸覺信息等約占20。可以知道視覺信息對人類的重要性,然后圖像就是人類獲取視覺信息的主要造徑。隨著科學技術的發(fā)展和人民生
8、活水平的提高,攝像機的出現(xiàn)和數(shù)字圖像處理技術的發(fā)展,在如今的數(shù)字化時代中,越來越引起人們的廣泛關注,數(shù)字圖像處理已經(jīng)成為必備的基礎知識。近年來由于計算機技術的蓬勃發(fā)展,圖像處理技術也得到了空前的發(fā)展和應用。目前,圖像處理技術已經(jīng)廣泛應用于工業(yè)、軍事、醫(yī)學、交通、農(nóng)業(yè)、天氣預報、銀行、超市、重要部門的監(jiān)控報警系統(tǒng)、可視電話、網(wǎng)絡傳輸?shù)鹊阮I域,就連人們?nèi)粘I钪械淖耘暮陀螒蛞埠蛨D像處理有密切的關系。本文主要是對計算機視覺系統(tǒng)的應用,圖像輪廓提取技術進行研究。實現(xiàn)表面缺陷的自動檢測圖像,灰度等級自動分選排序,提高圖像的價值有一個非常重要的作用。而影響檢測整體水平的重要方面之一是缺陷圖像的處理過程,而
9、本文研究的重點圖像輪廓提取技術是圖像分割、目標區(qū)域識別區(qū)域?qū)嵺`提取等圖像分析處理領域的基礎是非常重要的。用非接觸式,精度高,能夠提供全面的分析識別方法來替代人工視覺,解決圖像表面的模式識別和測量問題,是圖像加工行業(yè)面臨的一大難題,也是值得我們長期探討的科研課題。1.3 可行性分析 技術上的可行性:系統(tǒng)開發(fā)采用c+語言進行程序設計,運用opencv強大的數(shù)字圖像處理技術,在windows平臺上設計圖像邊緣檢測和圖像輪廓提取的圖像處理系統(tǒng),使用vs2012的開發(fā)環(huán)境,利用qt的界面管理,給系統(tǒng)提供了高性能的保障。保障了代碼的質(zhì)量,對代碼模塊有了清晰的管,和對后期代碼的修改和擴展提供了很好的支持。綜
10、上所述,本系統(tǒng)的設計與開發(fā)在技術上都是滿足的。經(jīng)濟上的可行性:隨著計算機的超速發(fā)展,計算機如今已是處于高配置,低價格的時代,而本系統(tǒng)的開發(fā),其應用在游戲,教育,文藝,工業(yè)等多個領域有著重要的意義。本系統(tǒng)的運行可以代替人工進行很多繁瑣重復的工作,節(jié)省物力人力和很多資源,大大提高了生產(chǎn)效率。所以在經(jīng)濟上是可行的1。 運行上的可行性:本系統(tǒng)作為一個小型的圖像輪廓提取系統(tǒng),所需資源無論是從硬件方面還是軟件方面都能夠滿足條件,所以在運行上也是可行的。2開發(fā)工具及輪廓提取概述2.1 opencv2.1.1 程序流程圖 opencv 全稱 opensourcecomputervisionlibrary,是由
11、inter公司資助的開源計算機視覺庫,它是用c/c+語言編寫的,可以實現(xiàn)圖像處理和計算機視覺中的很多算法,可以運行在linux/windows/mac等操作系統(tǒng)上。由于opencv的源代碼是完全開源的,并且編寫高效又簡潔,很多函數(shù)都已經(jīng)匯編最優(yōu)化。所以近些年來在國內(nèi)外的圖像處理和相關領域中被廣泛的使用,成為了一種流行的圖像處理軟件。主要應用領域有:1.人機互動2.物體識別3.圖象分割4.人臉識別5.動作識別6.運動跟蹤7.機器人等。2.1.2 opencv安裝及環(huán)境搭建首先把opencv正確的配置到vs開發(fā)環(huán)境中。設置預先編譯的頭文件的路徑與動態(tài)鏈接庫的路徑2。第一步:安裝opencv和環(huán)境變
12、量配置計算機- 屬性- 高級系統(tǒng)設置-環(huán)境變量加入名為opencv的變量,值為f:opencvbuild(這里是自己opencv安裝路徑),在path變量后追加;%opencv%x86vc11bin(x86是32位系統(tǒng),x64是64位系統(tǒng),vc11是vc2012,vc12是2013)。第二步:在vs2012中新建項目建好工程后,視圖-屬性管理器,右鍵debug,添加新項目屬性表,新建名為opencvx86.dp的項目屬性表(區(qū)分release的)。雙擊新建好的opencvx86.dps屬性表,找到 常規(guī) - vc+目錄 - 包含目錄 下拉后點開編輯,添加如下幾項
13、f:opencvbuildincludef:opencvbuildincludeopencvf:opencvbuildincludeopencv2確定后,點開庫目錄,編輯,追加如下2項:f:opencvbuildx86vc11libf:opencvbuildx86vc11staticlib確定后,返回vc+目錄,找到 鏈接器 - 輸入 - 附加依賴項。第三步:測試是否配置成功將自己所要顯示的圖片放到工程下,新建源文件輸入以下代碼,運行,若看到顯示圖片就說明配置成功了!如果以后有其他新建項目用到opencv,只需要在屬性管理器頁面導入以上創(chuàng)建的項目屬性表即可!2.2 邊緣檢測2.2.1 邊緣檢測
14、計算機處理圖像有兩個目的:第一個是產(chǎn)生更加能夠讓人觀察和識別的圖像,第二個是更加能夠讓計算機自動識別和理解圖像3??傊罱K的目的先對大量的圖像攜帶的信息進行分解,通過處理分解出來的最基本的基元從而來處理圖像。而邊緣檢測是計算機視覺和圖像處理中的基本問題,邊緣檢測的目的則是標識圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的變化。這些包括(i)深度上的不連續(xù)、(ii)表面方向不連續(xù)、(iii)物質(zhì)屬性變化和(iv)場景照明變化。邊緣檢測是圖像處理和計算機視覺中,尤其是特征提取中的一個研究領域。圖像的邊緣是圖像最基本的特征。圖像邊緣指的是周圍像素灰度有階級跳躍的變化或者屋頂變換的像素
15、的集合。邊緣的種類有兩種,我們通常把它們記作:階躍性邊緣(兩邊的灰度值有顯著的不同)和屋頂狀邊緣(存在于灰度值從增加到減少的變化轉(zhuǎn)折點),那么怎么分辨圖像的邊緣呢?圖像的邊緣其實就是存在在物體與物體,物體與圖像背景之間,這些都是我們能用眼睛看見的,可以從宏觀上這么說。其實基元與基元之間都存在著邊緣,這些是微觀方面的說話。所以這都是圖像要分割,分離的最基本的特征,我們通過尋找邊緣就能分離圖像。邊緣的種類有兩種,我們通常把它們記作:階躍性邊緣(兩邊的灰度值有顯著的不同)和屋頂狀邊緣(存在于灰度值從增加到減少的變化轉(zhuǎn)折點)。下面是幾種類型邊緣的截面圖。 圖2-1理想躍階式 圖2-2斜降式 圖2-3斜
16、升式 圖2-4 脈沖式 圖2-5屋頂式2.2.2 邊緣檢測原理通過前面的介紹我們也大概的了解到邊緣檢測的基本概念,我們把邊緣定義為圖像中灰度發(fā)生急劇變化的局域。那么邊緣檢測的原理就能很好的理解,就是用某些已存在的算法來解決我們所要表達的問題,更官方一點的話說就是用算法提取圖像和背景之間的交界線,從而來實現(xiàn)邊緣分離和提取4。邊緣檢測算子其實也就是解決問題的算法,這種算法自然有很多,早期的經(jīng)典算法有邊緣算子法,模擬匹配法,門限法等方法。近些年來隨著人工智能的方法,越來越多的人開始關注,于是又涌現(xiàn)了很多新的邊緣檢測算法,其中最為人多議論的有小波變換和小波包的邊緣檢測法、基于形態(tài)學和神經(jīng)網(wǎng)絡的邊緣檢測
17、法。我們可以來初步了解一下計算機是怎樣檢測圖像邊緣的。就以灰度圖像為例,它的理論基礎是,如果有一個邊緣,那么圖像的灰度就肯定會發(fā)生變化(為了方便假設由黑漸變?yōu)榘状硪粋€邊界),這時我們可以對其灰度分析,邊緣的灰度函數(shù)就是一個標準一次函數(shù)y=kx+b,我們對其求一階導數(shù)后結果就是它斜率k,也就是說邊緣的一階導數(shù)是一個常數(shù),而我們又知道由于非邊緣的一階導數(shù)為零,這樣通過求一階導數(shù)就能初步判斷圖像的邊緣了5。下面先來介紹下經(jīng)典的幾種算法。(1)roberts算子這里介紹一個名詞梯度,我們把梯度定義為一個向量(f),f指出了灰度變化最快的方向和變化量。用公式可以表示為 (2.1) 其中我們可以從以前學
18、過的數(shù)學知道它的梯度大小為 (2.2) 梯度的角度為 (2.3) 而這個roberts算子其實就是對圖像的x(水平方向)和y(垂直方向)來趨近梯度算子。 (2.4) 我們就能得出roberts算子的表達式為 (2.5)(2)sobel算子 上面介紹了計算機通過y=kx+b求導數(shù)識別圖像邊緣的,但是在具體圖像中我們會發(fā)現(xiàn)是求不了導數(shù)的,因為沒有準確的函數(shù)公式讓我們來求導數(shù),所以厲害的研究人員就想到了用另一種方式來替換原來的方式求導數(shù)。用一個33的二維矩陣窗口對原來圖像進行近似求導。這里拿對x方向求導為例,如下圖2-6,我們定義b2的導數(shù)ko為第三列的元素(a3,b3,c3)之和減去第一列元素(a
19、1,b1,c1)之和,這樣就求得了b2的近似導數(shù)。我們知道導數(shù)其實就是代表一個變化率,從第一列到第三列,灰度值相減,當然就是一個變化率了。當然y方向?qū)?shù)與x方向?qū)?shù)求法相似,就是用第三行元素之和減去第一行元素之和。這樣一來x方向和y方向?qū)?shù)有了,那么梯度我們也就知道了。 如果這個時候我們給每一列都加一個權重,分別為1,2,1。這就是sobel算子了。再舉一例,如圖2-7中,求是不是邊緣點,我們有公式得= (10*1+20*2+30*1)-(30*1+20*2+10*1)=0。由此可知不是邊緣點。圖2-8和圖2-9中的gx和gy分別為sobel算子中水平方向和垂直方向的梯度。 圖2-6 矩陣1
20、圖2-7 矩陣x 圖2-8水平方向梯度 圖2-9 垂直方向梯度 (3)laplace算子 上面介紹的兩個算子都是一階差分算子,而laplace算子是二階差分算子。我們可以想象為對一個函數(shù)的二次求導。我們可以想象一下,如果圖像中有噪聲(圖像在傳輸過程中的通道傳輸誤差等因素會造成圖像上出現(xiàn)一些隨機的、離散的、孤立的像素點,就是圖像噪聲),噪聲在一階導數(shù)處也會取得極大值從而被當作邊緣。如果采用二階導數(shù),這是函數(shù)的極大值點就為0了,我們就可以認為這個點就是圖像的邊緣點了。如下圖2-10為原函數(shù),圖2-11為一階導數(shù),圖2-12為二階導數(shù)。 f(x) f(x) f(x) 圖2-10 原函數(shù) 圖2-11
21、一階導數(shù) 圖2-12 二階導數(shù) 但是laplace算子會放大噪聲,所以我們要采用了log算子,就是laplace算子,先對圖像進行高斯模糊,抑制噪聲,再求二階導數(shù),二階導數(shù)為0的地方就是圖像的邊緣。 (4) canny算子 我從一些博客和資料中了解到了canny的原理。我們知道圖像邊緣檢測要滿足兩個條件,一是能有效的抑制噪聲;二是能精確的確定邊緣的位置。然后根據(jù)對信噪比和定位的乘積來進行度量,得到優(yōu)化的算子,這其實就是canny邊緣檢測算子。類似于laplace邊緣檢測方法,先平滑后求導數(shù)6。我們來了解一下canny的步驟。 1.消除噪聲;在這一步中,其實就是用高斯平滑濾波器卷積降低噪聲。也就
22、是一個固定值的內(nèi)核。如下圖2-13所示。 圖2-13 5核高斯內(nèi)核 2.用一階偏導的有限差分來計算梯度的幅值和方向; 這一步類似于sobel算子的求x,y方向上的梯度。 圖2-14 水平和垂直方向上的卷積然后使用下列公式,求得梯度的幅度g和方向(一般為0,45,90,135)。 (2.6)3. 對梯度幅值進行非極大值抑制;g1 g2 d1 c g3 d2 g4經(jīng)過上面的步驟,得到梯度并不能確定邊緣,因此我們應該保留局部梯度最大的點,而抑制非極大值。如果圖像梯度幅值矩陣中的元素值越大,說明圖像中該點的梯度值越大,但這不不能說明該點就是邊緣。在canny算子里面,非極大值抑制是圖像邊緣檢測的最重要
23、的步驟,它的任務就是尋找像素點局部最大值,將非極大值點所對應的灰度值置為0,這樣做就能刪除一大部分的非邊緣的點7。 圖2-15 非極大值抑制圖我從一篇博客上了解到了非極大值抑制的工作原理。由上圖2-15可知,要進行非極大值抑制,以圖中c像素點為例,我們首先要知道像素點c的灰度值是否在它的8值鄰域中最大。圖中紅色的線方向我們認為是c像素點的方向,我們就可以認為它局部的最大值是分布在這條線紅色的線上的,而梯度方向的交點d1和d2這兩個像素點的值也可能是局部最大值。綜上可知,我們比較c像素點和這兩像素點的灰度就可以判斷c像素點的灰度值是否在它的8值鄰域中最大。如果c像素點灰度值最小,c像素點不是局部
24、最大灰度值,那么我們就可以認定c像素點不是邊緣8。4.用雙閾值算法檢測和連接邊緣。這一步,canny 采用了滯后閾值,滯后閾值需要兩個閾值,一般有三種情況作為判定是否為邊緣點,第一如果某個像素點位置的幅值高于高閾值,,則該像素被保留為邊緣像素點。第二如果某個像素點的位置的幅值低于低閾值,則該像素點不是邊緣像素點,移除。如果某個像素點的位置在高閾值和低閾值之間,則該像素點只在被連接到高于高閾值的像素點時才被保留。好吧,我們來看看opencv中canny算法。我們還是看看實現(xiàn)函數(shù)和其參數(shù)。void canny(inputarray image,/輸入圖像,即源圖像outputarray edges
25、,/輸出邊緣圖像,需要和源圖像一樣的尺寸和類型double threshold1,/第一個滯后性閾值double threshold2,/第而個滯后性閾值int aperturesize=3,/表示應用sobel算子的孔徑大小,其有默認值3bool l2gradient=false);/計算圖像梯度幅值的標識,默認值為false2.3 輪廓提取2.3.1 輪廓提取目的為什么要對圖像進行處理呢,在現(xiàn)實生活中其實都都能多例子,比如為了讓自拍照變得漂亮,為了更清新的看見圖片內(nèi)容,將很多照片的部分拼湊起來變成更好有價值的圖像等等。前面已經(jīng)介紹,利用計算機對圖像進行處理,其目的就是得到更適合人觀察和識別
26、的圖像或者由計算機自動識別和理解的圖像9。提取圖像的基本特征和屬性,用于計算機分析后就能得出自己想要的圖像,圖像的輪廓作為圖像的基本特征,經(jīng)常被應用到較高層次的圖像應用中去。本論文研究的圖像輪廓提取其實就是實現(xiàn)上述目的的重要的基礎。2.3.2 輪廓提取內(nèi)容圖像輪廓攜帶著圖像大部分信息,而輪廓存在于圖像不規(guī)則的結構和不穩(wěn)定的像素點,當然也有的存在于信號的突變處。這些輪廓就是我們在圖像邊緣檢測時重要的條件和因數(shù),所以我們需要對圖像進行邊緣檢測從而提取出圖像的輪廓出來。這些方法或者說是算法都是我們前面說研究過的。有時我們要把自己感興趣的東西從目標圖像中提取出來,一般用到的方法是通過顏色或紋理提取出目
27、標圖像的前景圖,如果這是我們要對前景圖進行分析然后把目標提取出來,這里用到的方法就是提取目標的輪廓10。3需求分析3.1 系統(tǒng)功能分析本文主要是研究的圖像的邊緣處理技術(邊緣檢測和輪廓提?。┑囊恍┧惴?。前面我們介紹了很多經(jīng)典的圖像邊緣檢測的方法,它們是構造對像素點灰度階躍變化明顯的微分算子(sobel算子等)。這種檢測速度是非常喜人的,但是我們得到的圖像結果一般都是斷斷續(xù)續(xù)的,不怎么完整的結構信息??伤鼈兊膬?yōu)勢在于它們對噪聲非常的敏感,一般這類算法都要對愿圖像進行平滑操作,然后在進行邊緣檢測,這樣一來就能夠檢測出真正的圖像邊緣了。在邊緣檢測技術中比較靠譜的方法就是線性濾波器,這其實就是lapl
28、ace算子。它能很好的解決頻域最優(yōu)化和空域最優(yōu)化之間的矛盾,這類算子的優(yōu)點在于,利用零點檢測中具有各向同性的特點,保證了邊緣的封閉性。這樣處理的圖像會更加符合人眼對圖像的視覺效果。我希望利用所學的知識,在vs+qt的環(huán)境中來實現(xiàn)它們,進一步的理解它們,能使最后得到的圖像有很好的效果3.2 系統(tǒng)流程圖選取圖像打 開文 件開始圖像處理保存 目標圖像 圖3-1 系統(tǒng)流程圖4總體設計4.1 系統(tǒng)功能要求及說明和實現(xiàn)方法這一部分是介紹系統(tǒng)的實現(xiàn)過程,敘述系統(tǒng)的整體框架。對系統(tǒng)有一個全面的認識,將它的功能和實現(xiàn)方法有全面的了解。在功能上,我們主要有幾個要求,第一整體風格要大方一致,結構要清晰合理,實行模塊
29、化管理,界面要清晰,要使用戶一眼就能明白,方面用戶操作。第二要做到開發(fā)的代碼簡潔,便于管理,便于修改,便于擴充。第三,有完善的數(shù)據(jù)的輸入和輸出,容錯性好,不會因為用戶的某個操作造成程序的崩潰,提示多,每一步的操作都很簡單明了,都能提醒用戶及時改正11。實現(xiàn)方法,我采用的是qt5.0+vs2012+opencv3.0的框架,選擇qt我看好的是qt5.0是一個跨平臺的c+圖形用戶界面應用程序框架,相比原來qt5.0提升了兼容性,更加兼容opencv圖像處理和渲染。然而qt create的出現(xiàn)也方便了我對代碼的編寫,很多一鍵式的操作,給用戶帶來了很多便利。使用qt也就不言而喻了。本系統(tǒng)主要由mycl
30、ass類和myclass.ui類組成。在qt中有qmainwindow提供一個有菜單條、例如工具條和一個狀態(tài)條的主應用程序窗口,而正是我們需要的。很直觀的想法是以qmainwindow作為父類派生出myclass類。在myclass類中,我們實現(xiàn)了對圖像的提取,圖像格式的轉(zhuǎn)換,圖像的處理,圖像的保存,按鍵監(jiān)聽,信號槽和界面退出等操作12。當然也是連接myclass.ui界面類的。在實現(xiàn)過程中,完成了對myclass類中,對各個函數(shù)的調(diào)試和修改,對代碼的注釋,對幫助提示框的修改。按鈕與實現(xiàn)功能事件一一對應,最后對程序進行打包。4.2 系統(tǒng)功能模塊本系統(tǒng)結構分為四個模塊,如圖4-1所示。分別為:文
31、件模塊:對圖片文件的打開,顯示在界面,圖片大小的自適應,圖片格式轉(zhuǎn)換,保存模塊:對處理后的圖片文件格式轉(zhuǎn)換,保存。邊緣檢測模塊:運用前章節(jié)所介紹的各種算子,進行圖片邊緣檢測。輪廓提取模塊:對圖像輪廓提取。圖像輪廓處理系統(tǒng)輪廓提取邊緣檢測保存圖片圖片提取圖4-1 系統(tǒng)模塊圖下面圖4.2每個子模塊功能圖。 圖片提取讀取圖片 路徑轉(zhuǎn)換圖片格式顯示圖片在ui上 圖4-2 圖片提取功能模塊圖 輪廓提取讀取ui上的圖片二值化處理輪廓提取輪廓標記灰度處理 圖4-3各輪廓提取功能模塊圖5詳細設計5.1 圖片提取這個模塊首先是利用qt create創(chuàng)建了一個名為myclass.ui界面類,在類中添加了一個按鈕p
32、ushbutton。然后利用qt中的信號/槽關聯(lián)一個事件函數(shù)openimageclicked(),在該函數(shù)中實現(xiàn)對圖片的提取。下面為實現(xiàn)代碼。 qstring filename = qfiledialog:getopenfilename(this,tr(open image), .,tr(image files (*.png *.jpg *.bmp); qdebug()filenames:label-settext(filename); originalimg = image.clone(); /復制克隆原圖片qimg = myclass:mat2qimage(image); /轉(zhuǎn)換圖片格式m
33、at-qimage display(qimg); /顯示圖片在ui上來的label上 if(image.data) /根據(jù)圖片的讀取情況判斷按鈕的顯示狀態(tài) ui-pushbutton-setenabled(true);ui-pushbutton_2-setenabled(true); 5.2 圖片邊緣檢測(1)sobel邊緣算子我們來了解一下sobel算子在opencv中的實現(xiàn)吧。在opencv中,用sobel這個函數(shù)來實現(xiàn)的。 void sobel ( inputarray src,/輸入圖像 outputarray dst,/輸出圖像 int ddepth,/輸出圖像的深度 int dx,
34、/x 方向上的差分階數(shù) int dy,/y 方向上的差分階數(shù) int ksize=3,/表示sobel核的大小(如同上面看見的矩陣),默認值為3 double scale=1,/計算導數(shù)值時可選的縮放因子,默認值為1(沒有應用縮放) double delta=0,/表示在結果存入目標圖像之前可選的delta值,默認值為0 int bordertype=border_default );/邊界模式,默認值為border_default 在這一個模塊中,我依然沿用了ui-myclass 信號/槽的模式,將ui中的sobel檢測按鈕與myclass類中的sobelimageclicked()函數(shù)相關
35、聯(lián)。然后實現(xiàn)sobel邊緣檢測。代碼如下。 void myclass:sobelimage(int ,void *)/sobel實現(xiàn)函數(shù)if(!image.empty()/原圖,原圖的灰度版,目標圖 mat g_srcimage, g_srcgrayimage,g_dstimage; /sobel邊緣檢測相關變量mat g_sobelgradient_x, g_sobelgradient_y; mat g_sobelabsgradient_x, g_sobelabsgradient_y; int g_sobelkernelsize=1;/trackbar位置參數(shù) g_srcimage =ima
36、ge;/顯示原始圖namedwindow( sobel邊緣檢測, 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 );/計算絕對值,并將結果轉(zhuǎn)換成8位 sobel(g_srcimage,g_sobelgradient_y,cv_16s, 0, 1, (2*g_
37、sobelkernelsize+1), 1, 1, border_default ); / 求y方向梯度 convertscaleabs( g_sobelgradient_y, g_sobelabsgradient_y );/計算絕對值,并將結果轉(zhuǎn)換成8位 addweighted( g_sobelabsgradient_x, 0.5, g_sobelabsgradient_y, 0.5, 0, g_dstimage ); / 合并x和y方向的梯度 imshow(sobel邊緣檢測, g_dstimage); /顯示效果圖 elseqmessagebox:information(this, tr
38、(error!), tr(please click picture!).arg();/彈出錯誤提示框 看完代碼和注釋后,我們大概知道了sobel的實現(xiàn)過程,下面我們來看看測試結果吧。 圖5-1 sobel邊緣檢測效果圖(2) laplace邊緣算子現(xiàn)在我們來看看laplace在opencv中是怎樣實現(xiàn)的。void laplacian(inputarray src,/輸入圖像outputarray dst,/輸出圖像 int ddepth,/輸出圖像的深度 int ksize=3,/表示sobel核的大小(如同上面看見的矩陣),默認值為3 double scale=1,/計算導數(shù)值時可選的縮放因
39、子,默認值為1(沒有應用縮放) double delta=0,/表示在結果存入目標圖像之前可選的delta值,默認值為0 int bordertype=border_default );/邊界模式,默認值為border_default我們可以看到在這個laplacian函數(shù)中和sobel參數(shù)基本相同。下面我們來看看效果怎么樣。如圖5-2。 圖5-2 laplace邊緣檢測效果圖(3) canny邊緣算子這個模塊的實現(xiàn)也是用的上面的模式,簡單明了的實現(xiàn)了canny邊緣算子的功能。在opencv中,canny的參數(shù)與laplace算子的參數(shù)差不多,我們來看看實現(xiàn)函數(shù)和其參數(shù)。void canny(
40、inputarray image,/輸入圖像,即源圖像outputarray edges,/輸出邊緣圖像,需要和源圖像一樣的尺寸和類型double threshold1,/第一個滯后性閾值double threshold2,/第而個滯后性閾值int aperturesize=3,/表示應用sobel算子的孔徑大小,其有默認值3bool l2gradient=false);/計算圖像梯度幅值的標識,默認值為false下面是實現(xiàn)代碼:void myclass:cannyimage(int,void *)if(!image.empty()mat g_srcimage, g_srcgrayimage,
41、g_dstimage; mat g_cannydetectededges; /canny算子的原圖,二值圖,目標圖的聲明。int g_cannylowthreshold=20;/canny檢測處理的值,我自己設置檢測程度。 g_srcimage =image;/獲得ui上的圖片namedwindow( canny邊緣檢測, window_autosize);/創(chuàng)建邊緣檢測處理后的新窗口 g_dstimage.create( g_srcimage.size(), g_srcimage.type() ); /創(chuàng)建與原始圖像同類型和大小的矩陣(dst) cvtcolor( g_srcimage, g
42、_srcgrayimage, cv_bgr2gray ); / 將原圖像轉(zhuǎn)換為灰度圖像 blur( g_srcgrayimage, g_cannydetectededges, size(3,3) ); /使用 3x3內(nèi)核來降噪 canny(g_cannydetectededges,g_cannydetectededges,g_cannylowthreshold, g_cannylowthreshold*3, 3 );/使用canny算子處理g_dstimage = scalar:all(0); g_srcimage.copyto( g_dstimage, g_cannydetectededge
43、s); /復制處理后的圖像到目標圖像中imshow( canny邊緣檢測, g_dstimage ); /顯示目標圖像elseqmessagebox:information(this, tr(error!), tr(please click picture!).arg();/彈出幫助提示框下面是原圖和目標圖的對比效果: 圖5-3 canny邊緣檢測效果圖5.3 圖像輪廓提取圖像輪廓到底是什么?有的說輪廓就是一系列的點,也有的說就是圖像中的一條曲線。我們可以根據(jù)不同的表現(xiàn)方法來定義不同的圖像輪廓,就像同多種邊緣算法都能檢測出圖像的邊緣。我了解到在opencv中一般是用序列來存儲輪廓信息.序列中的
44、每個元素是就是圖像曲線的一個位置反映.只要簡單把輪廓想象為使用cvseq表示的一系列的點就可以了。在opencv中,我們用findcontours()函數(shù)進行輪廓提取,如下圖5-4,是輪廓提取后的效果圖,可以看到在圖中我們設定為c為內(nèi)輪廓,h為外輪廓,兩種輪廓,在不同的算子實現(xiàn)方法中,就分別表示輪廓的外邊界和內(nèi)邊界。在opencv中我們把得到的輪廓用輪廓樹來表達,從而把包含關系編碼到樹結構中.這個圖的輪廓樹在根節(jié)點的輪廓叫c0,孔h00和h01是它的字子節(jié)點.這些輪廓中直接包含輪廓稱為他們的子節(jié)點,以此類推.不同的輪廓樹的方式,代表不同的輪廓存儲方式。 a cde b h00 c0 h01 h
45、0000 c000h0001c0001c000c 圖5-4 輪廓解析圖findcontours()是圖像輪廓提取函數(shù),從二值圖像中尋找輪廓findcontours()處理圖像可以是從canny()函數(shù)得到的有邊緣像素的圖像,或者是從threshold()及adaptivethreshold()得到的圖像。我們的實現(xiàn)方法就是采用的canny()函數(shù)得到圖像的邊緣?,F(xiàn)在我們來看看opencv中findcontours()函數(shù)的參數(shù)。int findcontours( cvarr* image, /image是輸入圖像,圖像必須是8位單通道圖像cvmemstorage* storage,/內(nèi)存存儲器
46、,cvfindcontours()找到的輪廓記錄在此內(nèi)存里cvseq* first_contour,/是指向cvseq*的一個指針,指向輪廓樹的首地址,int header_size cv_default(sizeof(cvcontour),/存儲cvfindcontours()更多有關對象分配的信息,可以設定為sizeof(cvcontour)或者sizeof(cvchain),int mode cv_default(cv_retr_list), /計算方法,一般為四種參數(shù):cv_retr_external, cv_retr_list, cv_retr_ccomp或cv_retr_tree.
47、mode的值向findecontours()說明需要的輪廓類型,和希望的放回值形式。int method cv_default(cv_chain_approx_simple), /怎么計算cvpoint offset cv_default(cvpoint(0,0); 下面是在系統(tǒng)中的實現(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;src =
48、 image; /圖片關聯(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/定義點和向量 vectorvector contours;vector hierarchy;canny( src_gray, canny_output, thresh, thresh*2, 3 );/ 用canny算子檢測邊緣
49、,當然也可以使用其他邊緣算子findcontours(canny_output,contours,hierarchy,retr_tree,chain_approx_simple, point(0, 0) );/輪廓查找 / 繪出輪廓 mat drawing = mat:zeros( canny_output.size(), cv_8uc3 ); /遍歷所有頂層輪廓,隨機生成顏色值繪制給各連接組成部分for( int i = 0; i contours.size(); i+ ) scalar color = scalar( rng.uniform(0, 255), rng.uniform(0,2
50、55), rng.uniform(0,255) ); /繪制填充輪廓 drawcontours(drawing,contours, i, color, 2, 8, hierarchy, 0, point() ); imshow( 輪廓提取, drawing );/ 在窗體中顯示結果elseqmessagebox:information(this, tr(error!), tr(please click picture!).arg();/彈出提取框現(xiàn)在來看下效果,如圖5-5: 圖5-5 輪廓提取效果圖其中可根據(jù)canny檢測算子(也可以使用其他算子)的參數(shù)提取自己想要得到的輪廓。6 程序界面系統(tǒng)的風格也是自己設計的,主要格調(diào)是黑色,我覺著這樣會給用戶一種非常舒適的感覺,下面就是基本界面也就是主界面的截圖,如圖6-1。 圖6-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鐵路貨場改擴建項目社會穩(wěn)定風險評估與風險評估技術報告
- 2025年廢舊電子產(chǎn)品處理與資源回收產(chǎn)業(yè)技術創(chuàng)新研究報告
- 文化藝術中心建筑2025年初步設計建筑室內(nèi)光環(huán)境評估報告
- 2025-2030中國草藥香皂行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030中國花卉交易市場行業(yè)市場發(fā)展分析及競爭格局與投資前景研究報告
- 2025-2030中國藝術攝影服務行業(yè)市場深度調(diào)研及價值評估與投資前景研究報告
- 農(nóng)業(yè)大數(shù)據(jù)應用與新型經(jīng)營主體培育策略研究報告
- 冷鏈物流溫控技術與冷鏈物流運輸工具的匹配性研究報告
- 藥師顯黑測試題及答案
- 中考思政考試題及答案
- 2025屆江蘇省蘇州市八校高三下學期三模聯(lián)考物理試卷(含解析)
- 分子氧氧化丙烯制環(huán)氧丙烷銅基催化劑的制備及性能研究
- 找人辦事花錢協(xié)議書
- 2024-2025學年青島版(五四學制)小學數(shù)學二年級下冊(全冊)知識點復習要點歸納
- 人教版五下-6.1 同分母分數(shù)加減法(教學課件)
- 2025年入團考試必考題目試題及答案
- 商標基礎知識試題及答案
- 中小學人工智能通識教育指南(2025年版)
- 職業(yè)技術學院裝配式建筑工程技術專業(yè)人才培養(yǎng)方案(2024版)
- 學校學生食品安全培訓課件
- 福建省2024-2025學年高一下學期4月期中聯(lián)考英語試題(原卷版+解析版)
評論
0/150
提交評論