版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章圖像分割與測(cè)量9.1概述圖像分析過(guò)程圖像圖像識(shí)別圖像預(yù)處理圖像理解圖像分割圖像分割與測(cè)量是圖像識(shí)別工作的基礎(chǔ)。圖像分割將圖像分為一些有意義的區(qū)域,然后可以對(duì)這些區(qū)域進(jìn)行描述,相當(dāng)于提取出某些目標(biāo)區(qū)域圖像的特征,判斷圖像中是否有感興趣的目標(biāo)。圖像分割的基礎(chǔ)是像素間的相似性和跳變性。圖像分割的概念分成若干個(gè)互不相交的小區(qū)域的過(guò)程,小區(qū)域是某種意義下具有共同屬性的像素的連通集合。各區(qū)域?qū)δ撤N性質(zhì),如灰度,紋理等有相似性。區(qū)域內(nèi)部是連通的,沒(méi)有過(guò)多小孔。區(qū)域邊界是明確的,相鄰區(qū)域?qū)Ψ指钏罁?jù)的性質(zhì)有明顯的差異。圖像分割的概念圖像分割圖像分割:把圖像分成各具特性的區(qū)域,如目標(biāo)或前景與背景,選擇性地定位感興趣目標(biāo)在圖像中的位置和范圍,提取出感興趣目標(biāo)的技術(shù)和過(guò)程。
人的視覺(jué)系統(tǒng)對(duì)圖像分割是十分復(fù)雜的,也是相當(dāng)有效的。但分割原理和模型都未搞清楚。圖像分割的基本思路:從簡(jiǎn)到難,逐級(jí)分割控制背景環(huán)境,降低分割難度把焦點(diǎn)放在增強(qiáng)感興趣對(duì)象,縮小不相干圖像成分的干擾上。圖像分割邊緣檢測(cè):檢測(cè)出邊緣,再將邊緣像素連接,構(gòu)成邊界形成分割,找出目標(biāo)物體的輪廓,進(jìn)行目標(biāo)的分析、識(shí)別、測(cè)量等。閾值分割:最常用法。有直方圖門限選擇,半閾值選擇圖像分割,迭代閾值。邊界方法:直接確定區(qū)域邊界,實(shí)現(xiàn)分割;有邊界跟蹤法,輪廓提取法。區(qū)域法:將各像素劃歸到相應(yīng)物體或區(qū)域的像素聚類方法;有區(qū)域增長(zhǎng)法等。圖像分割四種不同的方法概述分割的目的是將圖像分為一些有意義的區(qū)域,如目標(biāo)或前景,然后可以對(duì)這些區(qū)域進(jìn)行描述。圖像分割的基本思路:從簡(jiǎn)到難,逐級(jí)分割;控制背景環(huán)境,降低分割難度,把焦點(diǎn)放在增強(qiáng)感興趣的對(duì)象,縮小不相干圖像成分的干擾上。圖像分割的方法有多種,依據(jù)工作對(duì)像來(lái)分,可分為點(diǎn)相關(guān)分割和區(qū)域相關(guān)分割;按算法分類,可分為閥值法,界限檢測(cè)法,匹配法,跟蹤法等。9.2閾值法分割12基本原理原始圖像——f(x,y)灰度閾值——T閾值運(yùn)算得二值圖像——g(x,y)閾值分割9.2.1直方圖門限選擇法9.2.1直方圖閾值選擇
閾值T可通過(guò)分析邊緣檢測(cè)輸出的直方圖來(lái)確定。假設(shè),一幅圖像只有物體和背景兩部分組成,其灰度級(jí)直方圖成明顯的雙峰值。255f(i,j)16人工閾值人工選擇法是通過(guò)人眼的觀察,應(yīng)用人對(duì)圖像的知識(shí),在分析圖像直方圖的基礎(chǔ)上,人工選出合適的閾值。也可以在人工選出閾值后,根據(jù)分割效果,不斷的交互操作,從而選擇出最佳的閾值。17直方圖閾值選擇閾值選擇直接影響分割效果,利用灰度直方圖求兩峰之間的谷底作為閾值。18T=70的二值化圖像原始圖像直方圖人工閾值255如果f(i,j)≥Tf(i,j)=
0如果f(i,j)<T或:
0如果f(i,j)≥Tf(i,j)=
255如果f(i,j)<T直方圖閾值選擇
若直方圖呈現(xiàn)多個(gè)明顯的峰值,如三個(gè)峰值,可取兩個(gè)峰谷處的灰度值T1,T2作為閾值。同樣,可將閾值化后的圖像變成二值化圖像。
f(i,j)T1T22550直方圖閾值選擇其數(shù)學(xué)表達(dá)式為:
0如果T1≤f(i,j)≤T2f(i,j)=
255其它或
255如果T1≤f(i,j)≤T2f(i,j)=
0其它
直方圖閾值選擇1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內(nèi)存空間,初始化為255。3)圖像灰度統(tǒng)計(jì),顯示灰度直方圖。4)通過(guò)對(duì)話框選取一個(gè)峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則置為255。6)將結(jié)果復(fù)制到原圖像數(shù)據(jù)區(qū)。實(shí)現(xiàn)步驟效果圖(a)根據(jù)直方圖選擇閾值(b)原圖(c)二值化效果展示根據(jù)直方圖9-3所示,將兩峰之間的谷底140作為閾值。
圖9-3直方圖19.2.2半閾值選擇法9.2.2半閾值選擇分割不論圖像的直方圖具有雙峰還是多峰值,閾值化后將原多值圖像變成二值圖像,若希望只把圖像的背景表示成二值圖像(即背景不是最白就是最黑),而物體為多值圖像。此時(shí),可采用半閾值技術(shù),把物體從背景中分離出來(lái)。半閾值化表示為:
f(i,j)如果f(i,j)≥Tf(i,j)=
0或者255如果f(i,j)<T
或
f(i,j)如果f(i,j)≤Tf(i,j)=
0或者255其它半閾值選擇分割1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內(nèi)存空間,并初始化為255。3)進(jìn)行圖像灰度統(tǒng)計(jì),顯示灰度直方圖。4)選取一個(gè)峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則保持灰度值不變。實(shí)現(xiàn)步驟(a)根據(jù)直方圖選擇閾值
(b)半閾值選擇分割效果圖cv2.calcHist()函數(shù)用于統(tǒng)計(jì)圖像直方圖信息hist=cv2.calcHist(image,channel,mask,histSize,range,accumulate)hist:表示返回的統(tǒng)計(jì)直方圖,數(shù)組內(nèi)的元素是各個(gè)灰度級(jí)的像素個(gè)數(shù);image:表示原始圖像,該圖像需要用“[]”括起來(lái);channel:表示指定通道編號(hào),通道編號(hào)需要用“[]”括起來(lái);mask:表示掩模圖像,當(dāng)統(tǒng)計(jì)整幅圖像的直方圖時(shí),將這個(gè)值設(shè)為None;當(dāng)統(tǒng)計(jì)圖像某一部分的直方圖時(shí),需要用到掩模圖像;histSize:表示BINS的值,該值需要用“[]”括起來(lái);range:表示像素值范圍;accumulate:表示累計(jì)標(biāo)識(shí),默認(rèn)值為False。如果被設(shè)置為True,則直方圖在開始計(jì)算時(shí)不會(huì)被清零,計(jì)算的是多個(gè)直方圖的累計(jì)結(jié)果,用于對(duì)一組圖像計(jì)算直方圖。該參數(shù)是可選的,一般情況下不需要設(shè)置。函數(shù)說(shuō)明效果展示根據(jù)直方圖9-5所示,將兩峰之間的谷底140作為閾值。
圖9-5直方圖2效果展示
圖9-6半閾值選擇圖像分割處理效果圖9.2.3迭代閾值法34基本思想:選擇一個(gè)閾值作為初始值,按某種策略不斷地迭代改進(jìn),直到滿足給定的準(zhǔn)則。自動(dòng)輸出一個(gè)閾值。在迭代過(guò)程中,關(guān)鍵是閾值改進(jìn)策略,閾值改進(jìn)策略要求:快速收斂,新產(chǎn)生閾值優(yōu)于上一次的閾值。9.2.3迭代閾值分割迭代閾值法
1)選擇圖像灰度的中值作為初始閾值Ti=T0。2)利用閾值Ti把圖像分割成兩部分區(qū)域,R1和R2,并計(jì)算其灰度均值。3)計(jì)算新的閾值Ti+14)重復(fù)步驟2、3,直到Ti+1和Ti的閾值差別小于某個(gè)給定值。1)獲得原圖像的首地址,圖像的高和寬。2)進(jìn)行直方圖統(tǒng)計(jì)。3)設(shè)定初始閾值T=127。4)分別計(jì)算圖像中小于T和大于T的兩組平均灰度值。5)迭代計(jì)算閾值,直至兩個(gè)閾值相等。7)根據(jù)計(jì)算出的閾值,對(duì)圖像進(jìn)行二值化處理。實(shí)現(xiàn)步驟37原始圖像迭代閾值二值化效果圖函數(shù)說(shuō)明matplotlib模塊可以使用其中的hist()函數(shù)來(lái)直接繪制圖像的直方圖。n,bins,patches=matplotlib.pyplot.hist(src,bins=10,normed=False,histtype=u'bar',**kwargs)返回值:
n:直方圖向量,是否歸一化由參數(shù)normed設(shè)定。當(dāng)normed取默認(rèn)值時(shí),n即為直方圖各組內(nèi)元素的數(shù)量(各組頻數(shù));
bins:返回各個(gè)bin的區(qū)間范圍;
patches:返回每個(gè)bin里面包含的數(shù)據(jù),是一個(gè)list;參數(shù):
src:表示原始圖像數(shù)據(jù),必須將其轉(zhuǎn)換為一維數(shù)據(jù);
bins:直方圖的柱數(shù),可選項(xiàng),默認(rèn)為10;
normed:是否將得到的直方圖向量歸一化。默認(rèn)為0;
histtype:直方圖類型,這些類型有:'bar','barstacked','step','stepfilled'。效果展示9.2.4Otsu閾值法小結(jié)Otsu算法主要采用最大類間方差法,將圖像分成背景和前景兩部分,要求這兩個(gè)部分的類內(nèi)離散度最小,類間離散度最大,使兩類間方差最大來(lái)確定最佳閾值。根據(jù)閾值T將圖像中的像素點(diǎn)分為C1和C2兩類,則:ω0=N0/M×Nω1=N1/M×NN0+N1=M×Nω0+ω1=1μ=ω0*μ0+ω1*μ1(9-12)
g=ω0(μ0-μ)^2+ω1(μ1-μ)^2(9-13)
將式(9-12)代入式(9-13),得到等價(jià)公式:
g=ω0ω1(μ0-μ1)^2在從0到255的范圍內(nèi),不斷調(diào)整閾值T;分別計(jì)算上式,找到上述最大的g(T),則對(duì)應(yīng)的T即為Otsu算法自動(dòng)選取的閾值。函數(shù)說(shuō)明在threshold()函數(shù)傳遞type參數(shù)時(shí),多傳遞一個(gè)參數(shù)cv2.THRESH_OTSU即可,必須把閾值設(shè)置為0。retval,dst=cv2.threshold(src,thresh,maxval,type)retval:表示返回的閾值;dst:表示輸出的圖像;src:表示要進(jìn)行閾值分割的圖像,可以是多通道的圖像;thresh:表示設(shè)定的閾值;maxval:表示type參數(shù),cv2.THRESH_OTSU;效果展示圖像Ostu算法閾值處理效果如圖9-8所示。左側(cè)為原始圖像,右側(cè)為處理后的圖像。圖9-8Ostu算法閾值處理效果圖9.2.5自適應(yīng)閾值法小結(jié)自適應(yīng)閾值可以看成一種局部性的閾值,通過(guò)規(guī)定一個(gè)區(qū)域大小,比較處理像素點(diǎn)與區(qū)域大小里面像素點(diǎn)的平均值—閾值(或者其他特征)的大小關(guān)系確定這個(gè)像素點(diǎn)是黑還是白。理想的情況下,色彩均衡的圖像,對(duì)整個(gè)圖像使用單個(gè)閾值進(jìn)行閾值化就會(huì)成功。但是,受到多種因素的影響,圖像的色彩并不會(huì)很均衡,在這種情況下,使用局部值(又稱自適應(yīng)值)進(jìn)行分割可以產(chǎn)生好的結(jié)果。函數(shù)說(shuō)明在OpenCV中提供函數(shù)cv2.adaptiveThreshold()來(lái)實(shí)現(xiàn)自適應(yīng)閾值處理,其一般格式為:dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,c)dst:輸出的圖像;src:輸入圖,只能輸入單通道圖像,通常來(lái)說(shuō)為灰度圖;maxval:當(dāng)像素值超過(guò)了閾值(或者小于閾值,根據(jù)type來(lái)決定)時(shí),所賦予的值adaptiveMethod:閾值的計(jì)算方法,包含以下2種類型:
cv2.ADAPTIVE_THRESH_MEAN_C:區(qū)域內(nèi)均值;
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:區(qū)域內(nèi)像素點(diǎn)加權(quán)和,權(quán)重為一個(gè)高斯窗口;thresholdType:二值化操作的類型BlockSize:圖片中區(qū)域的大??;C:閾值計(jì)算方法中的常數(shù)項(xiàng)。效果展示圖像自適應(yīng)閾值分割處理效果如圖9-9所示。圖9-9(a)為原始圖像,圖9-9(b)為采用權(quán)重相等方式的局部閾值處理;圖9-9(c)為采用權(quán)重為高斯分布的局部閾值處理??梢钥闯鰣D9-9(c)相對(duì)于圖9-9(b)保留了大量的細(xì)節(jié)信息。9.2.6分水嶺算法是一種分割方法;在分割中,與鄰近相似性作為參考依據(jù);將空間位置上相近和灰度值相近的像素點(diǎn),連接起來(lái)構(gòu)成一個(gè)封閉的輪廓;比喻為地理學(xué)上的地形表面實(shí)現(xiàn)分割。9.1分水嶺算法9.1.1算法原理灰度值高的區(qū)域看成山峰,灰度值低的區(qū)域看成山谷。由于噪聲,存在過(guò)度分割的現(xiàn)象;為了解決過(guò)度分割的問(wèn)題,使用基于標(biāo)記(mark)圖像的分水嶺算法。通常的mark圖像都是在某個(gè)區(qū)域定義了一些灰度層級(jí),在這個(gè)區(qū)域的洪水淹沒(méi)過(guò)程中,水平面都是從定義的高度開始的,這樣可以避免一些很小的噪聲極值區(qū)域的分割。9.1.2OpenCV中的相關(guān)函數(shù)完成分水嶺分割還需要:對(duì)灰度圖進(jìn)行OTSU二值化閾值處理;形態(tài)學(xué)函數(shù);距離變換函數(shù)cv2.distanceTransform();計(jì)算結(jié)果進(jìn)行閾值化處理,得到圖像內(nèi)子圖的一些形狀信息;對(duì)目標(biāo)進(jìn)行標(biāo)注,函數(shù)cv2.connectedComponent()使用cv2.watershed()函數(shù)實(shí)現(xiàn)分水嶺算法。1.形態(tài)學(xué)函數(shù)開運(yùn)算:先腐蝕后膨脹的操作。去除圖像內(nèi)的噪聲。在用分水嶺算法處理圖像前,要先使用開運(yùn)算去除圖像內(nèi)的噪聲,以避免噪聲對(duì)圖像分割可能造成的干擾。2.距離變換函數(shù)distanceTransform二值圖像內(nèi)任意點(diǎn)到最近背景點(diǎn)的距離。一般計(jì)算非零值像素點(diǎn)到最近的零值像素點(diǎn)的距離。其計(jì)算結(jié)果反映了各個(gè)像素與背景(值為0的像素點(diǎn))的距離關(guān)系。如果對(duì)上述計(jì)算結(jié)果進(jìn)行閾值化處理,就可以得到圖像內(nèi)子圖的一些形狀信息。距離變換函數(shù)實(shí)現(xiàn)步驟①將輸入圖片轉(zhuǎn)換為二值圖像,前景設(shè)置為1,背景設(shè)置為0②先遍歷圖像:左,左上,上,左下公式計(jì)算:D表示距離包括歐式距離,棋盤距離和麥哈頓距離;掩膜模板mask為maskL;f(p)為像素點(diǎn)p的像素值;③再次遍歷圖像,右,右上,右下,下;④根據(jù)模板maskL和maskR的掃描,得到最終的距離變換圖像。為了減少計(jì)算了量,采用了一種倒角模版的算法,只需要對(duì)圖像進(jìn)行兩次掃描,可以實(shí)現(xiàn)距離變換,該方法被稱為chamfer倒角距離變換,該模版如下:距離變換函數(shù)實(shí)現(xiàn)步驟函數(shù)介紹dst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])·dst表示計(jì)算得到目標(biāo)函數(shù)圖像?!rc表示原始圖像,必須是8通道的二值圖像?!istanceType表示距離類型。·maskSize表示掩模的尺寸大小。·dstType表示目標(biāo)函數(shù)的類型,默認(rèn)為CV_F。distanceType表示的是選取距離的類型,可以設(shè)置為CV_DIST_L1,CV_DIST_L2,CV_DIST_C等,具體如下:DIST_L1=1,distance=|x1-x2|+|y1-y2|DIST_L2=2,thesimple歐式distanceDIST_C=3,distance=max(|x1-x2|,|y1-y2|)DIST_L12=4,L1-L2metric:distance=2(sqrt(1+x*x/2)-1))DIST_FAIR=5,distance=c^2(|x|/c-log(1+|x|/c)),c=1.3998DIST_WELSCH=6,distance=c^2/2(1-exp(-(x/c)^2)),c=2.9846DIST_HUBER=7distance=|x|<c?x^2/2:c(|x|-c/2),c=1.345maskSize表示的是距離變換的掩膜模板,可以設(shè)置為3,5或CV_DIST_MASK_PRECISE,對(duì)CV_DIST_L1或CV_DIST_C的情況,參數(shù)值被強(qiáng)制設(shè)定為3,因?yàn)?×3mask給出5×5mask一樣的結(jié)果,而且速度還更快。labels表示可選輸出2維數(shù)組;labelType表示的是輸出二維數(shù)組的類型;defcalcEuclideanDistance(x1,y1,x2,y2): returnmath.sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));defdistanceTrans(src,x1):rows=src.shape[0]cols=src.shape[1]#第一遍遍歷圖像,使用左模板foriinrange(1,rows-1):forjinrange(1,cols-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j-1)fDisMin=min(float(src[i][j]),src[i][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j-1)fDisMin=min(fDisMin,src[i-1][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j)fDisMin=min(fDisMin,src[i-1][j]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j+1)fDisMin=min(fDisMin,src[i-1][j+1]+disPara)src[i][j]=fDisMin
#第二遍使用右模板,從右下角開始foriinrange(rows-2,0,-1):forjinrange(cols-2,0,-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j+1)fDisMin=min(float(src[i][j]),src[i][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j+1)fDisMin=min(fDisMin,src[i+1][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j)
fDisMin=min(fDisMin,src[i+1][j]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j-1)fDisMin=min(fDisMin,src[i+1][j-1]+disPara)src[i][j]=fDisMinreturnsrc[[000000][02552552552550][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][012210][02552552552550][02552552552550][000000]][[000000][011110][012210][012210][02552552552550][000000]]9-1-0觀察距離變換函數(shù)cv2.distanceTransform()
[[000000][011110][012210][012210][011110][000000]]1.原圖2.第一行距離3.第二行距離4.第三行距離5.第四行距離img=cv2.imread("F:/picture/coin.jpg")imageGray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#對(duì)灰度圖進(jìn)行OTSU閾值處理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#設(shè)定開運(yùn)算的卷積核#對(duì)二值圖像進(jìn)行開運(yùn)算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)distTransform=cv.distanceTransform(imageOpen,cv.DIST_L2,5)#計(jì)算歐氏距離#對(duì)距離圖像進(jìn)行閾值處理ret,fore=cv.threshold(distTransform,0.4*distTransform.max(),255,0)cv.imwrite("result.jpg",fore)使用距離變換函數(shù)cv2.distanceTransform()確定一幅圖像的前景圖像
a是原始的灰度圖像;b是經(jīng)過(guò)開運(yùn)算處理的圖像;c是距離變換函數(shù)cv2.distanceTransform()計(jì)算得到的圖像;d是對(duì)距離圖像經(jīng)過(guò)閾值處理后的圖像。d可以較為準(zhǔn)確地確定圖a的前景圖像。未知區(qū)域的確定開運(yùn)算是先膨脹后腐蝕,得到背景信息小于實(shí)際的背景信息,距離變換函數(shù)cv2.distanceTransform()只是得到了圖像的“中心信息”,即確定前景。對(duì)于一幅圖像來(lái)說(shuō),除去這兩種區(qū)域之外所剩的就是未知區(qū)域。imageGray=cv.imread("F:/picture/coin.jpg",0)#讀圖像#進(jìn)行Otsu閾值處理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#設(shè)定開運(yùn)算的卷積核#對(duì)二值圖像進(jìn)行開運(yùn)算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)#對(duì)開運(yùn)算后的圖像進(jìn)行膨脹操作,得到確定背景bg=cv.dilate(imageOpen,kernel,iterations=3)distTransform=cv.distanceTransform(imageOpen,cv.DIST_L2,5)#計(jì)算歐氏距離#對(duì)距離圖像進(jìn)行閾值處理ret,fore=cv.threshold(distTransform,0.4*distTransform.max(),255,0)fore=np.uint8(fore)#調(diào)整對(duì)距離圖像閾值處理的結(jié)果un=cv.subtract(bg,fore)#確定未知區(qū)域cv.imshow("imageGray",imageGray)#顯示原始灰度圖cv.imshow("bg",bg)#顯示確定背景圖像cv.imshow("distTransfom",distTransform)#顯示距離圖像cv.imshow("un",un)#顯示未知區(qū)域a:原始的灰度圖像;b:距離變換函數(shù)cv2.distanceTransform()計(jì)算得到的確定前景圖像;c:對(duì)原始圖像經(jīng)過(guò)膨脹操作得到的圖像,其背景圖像是確定背景;d是未知區(qū)域的圖像。由c減去b得到。1連通域是指圖像中具有相同像素值且位置相鄰的前景像素點(diǎn)組成的區(qū)域。2.連通區(qū)域分析:指將圖像中的各個(gè)連通區(qū)域找出并標(biāo)記。通常連通區(qū)域分析處理的對(duì)象是二值化后的圖像。l圖像的標(biāo)注圖像的標(biāo)注確定前景圖像后,cv2.connectedComponents()函數(shù)對(duì)圖像進(jìn)行標(biāo)注。將背景標(biāo)記為0,其他使用從1開始的整數(shù)標(biāo)記。
ret,labels=cv2.connectedComponents(image)·ret表示標(biāo)注的數(shù)量?!abels表示標(biāo)注的結(jié)果圖像。·image表示原始圖像,必須是8通道的圖像。補(bǔ)充:cv2.connectedComponentsWithStats()num_labels,labels,stats,centroids=cv2.connectedComponentsWithStats(image,connectivity=8,ltype=None)image:必須是二值圖,8位單通道圖像。connectivity:可選值為4或8,也就是使用4連通還是8連通。ltype:輸出圖像標(biāo)記的類型,目前支持CV_32S和CV_16U。
返回值:num_labels:所有連通域的數(shù)目labels:圖像上每一像素的標(biāo)記,用數(shù)字1、2、3…表示(不同的數(shù)字表示不同的連通域)對(duì)原始圖中的每一個(gè)像素都打上標(biāo)簽,背景為0,連通域打上1,2,3。。。的標(biāo)簽,同一個(gè)連通域的像素打上同樣的標(biāo)簽。stats:每一個(gè)標(biāo)記的統(tǒng)計(jì)信息,5列矩陣,每行對(duì)應(yīng)每個(gè)區(qū)域外接矩形的x、y、width、height和面積,表示每個(gè)連通區(qū)域的外接矩形(起始點(diǎn)的x、y、寬和高)和面積centroids:連通域的中心點(diǎn)左邊是確定的前景圖像,右邊是標(biāo)注的圖像,共標(biāo)注了20個(gè)結(jié)果。分水嶺分割在經(jīng)過(guò)上述操作后,cv2.watershed()函數(shù)實(shí)現(xiàn)圖像的分水嶺操作。img=cv2.watershed(image,markers)·img表示分水嶺操作的結(jié)果?!mage表示輸入的8位三通道圖像?!arkers表示32位單通道標(biāo)注結(jié)果?!纠?-4】使用cv2.watershed()函數(shù)對(duì)一幅圖像進(jìn)行分水嶺演示。小結(jié)分水嶺分割是基于自然的啟發(fā)算法來(lái)模擬水流通過(guò)地形起伏的現(xiàn)象,從而研究總結(jié)出來(lái)的一種分割方法,其基本原理是將圖像特征看作地理上的地貌特征,在分割中,它會(huì)把與鄰近像素間的相似性作為重要的參考依據(jù),從而將在空間位置上相近和灰度值相近的像素點(diǎn)互相連接起來(lái)構(gòu)成一個(gè)封閉的輪廓。具體實(shí)現(xiàn)方案如下:(1)對(duì)灰度圖進(jìn)行二值化處理,增強(qiáng)目標(biāo)前景,去除無(wú)用背景(2)利用形態(tài)學(xué)函數(shù),找到背景并標(biāo)記背景;確定背景信息B(3)利用距離變換函數(shù)cv2.distanceTransform()函數(shù),確定前景信息F距離變換函數(shù)實(shí)現(xiàn)步驟:小結(jié)①將輸入圖片轉(zhuǎn)換為二值圖像,前景設(shè)置為1,背景設(shè)置為0。②Chamfer倒角模版遍歷像素順序如圖9-10所示,需要對(duì)圖像進(jìn)行兩次掃描。依次選取左、左上、上、右下,等像素計(jì)算見(9-20)式,實(shí)現(xiàn)距離變換。其中,D表示距離包括歐式距離,棋盤距離和麥哈頓距離;小結(jié)掩膜模板mask為maskL;f(p)為像素點(diǎn)p的像素值。③依據(jù)圖9-10(b)所示的后向模板maskR再次遍歷圖像,依次選取右、右下、下、左下等像素計(jì)算(9-20)式,實(shí)現(xiàn)距離變換。④根據(jù)模板maskL和maskR的掃描,得到最終的距離變換圖像。(4)獲取邊緣,確定未知區(qū)域UN圖像中有了確定前景F和確定背景B,剩下的區(qū)域就是未知區(qū)域UN了。未知區(qū)域UN=
圖像O
-
確定背景B
-
確定前景F未知區(qū)域UN=(圖像O
-
確定背景B)-
確定前景F上式中的“圖像O
-
確定背景B”,可以通過(guò)對(duì)圖像進(jìn)行形態(tài)學(xué)的開運(yùn)算操作得到。(5)利用函數(shù)cv2.connectedComponent(),構(gòu)建標(biāo)記圖像(marker),對(duì)目標(biāo)進(jìn)行標(biāo)注使用函數(shù)cv2.connectedComponents()進(jìn)行標(biāo)注,該函數(shù)會(huì)將背景標(biāo)注為0,將其他的對(duì)象使用從1開始的正整數(shù)標(biāo)注。函數(shù)說(shuō)明使用cv2.watershed()函數(shù)實(shí)現(xiàn)分水嶺算法,(1)距離變換函數(shù)distanceTransformdst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])dst:表示計(jì)算得到目標(biāo)函數(shù)圖像??梢允?位或32位浮點(diǎn)數(shù),尺寸和src相同;src:表示原始圖像,必須是8通道的二值圖像;DistanceType:表示距離類型。常用距離類型標(biāo)識(shí)符和含義如表9-1所示。(2)圖像的標(biāo)注cv2.connectedComponents()函數(shù)對(duì)圖像進(jìn)行標(biāo)注。ret,markers=cv2.connectedComponents(image)ret:連通域的數(shù)目,表示標(biāo)注的數(shù)量;markers:表示標(biāo)注的結(jié)果圖像,圖像上每一個(gè)像素的標(biāo)記,用數(shù)字1、2、3、…表示(不同的數(shù)字表示不同的連通域),0表示背景;image:表示原始圖像,必須是8通道的圖像。函數(shù)說(shuō)明(3)分水嶺分割cv2.watershed()函數(shù)實(shí)現(xiàn)圖像的分水嶺操作。img=cv2.watershed(image,markers)img:表示分水嶺操作的結(jié)果;image:表示輸入圖像;markers:表示32位單通道標(biāo)注結(jié)果。效果展示圖像分水嶺算法處理效果如圖9-20所示,左面的圖像是原始的灰度圖,右邊的圖像是對(duì)其進(jìn)行分水嶺操作后的圖像。
圖9-20分水嶺算法處理效果圖9.3投影法分割水平投影量的計(jì)算1.水平投影實(shí)現(xiàn)步驟:①圖像二值化,物體為黑,背景為白。②循環(huán)各行,依次判斷每一列的像素值是否為黑,統(tǒng)計(jì)該行所有黑像素的個(gè)數(shù)。設(shè)該行共有M個(gè)黑像素,則把該行從第一列到第M列置為黑。實(shí)現(xiàn)步驟:①圖像二值化,物體為黑,背景為白。②循環(huán)各列,依次判斷每一行的像素值是否為黑,統(tǒng)計(jì)該列所有黑像素的個(gè)數(shù)。設(shè)該列共有M個(gè)黑像素,則把該列從第一行到第M行置為黑。垂直投影投影量的計(jì)算(a)原圖(b)水平投影(c)垂直投影效果圖9.3.1水平投影分割小結(jié)水平投影分割是沿著圖像水平方向,統(tǒng)計(jì)水平方向像素的累加計(jì)算量的集合,通過(guò)水平投影可以取得目標(biāo)物體所在的行數(shù)。實(shí)現(xiàn)步驟:①將圖像二值化,使物體為黑,背景為白。②循環(huán)各行,依次判斷每一列的像素值是否為黑,統(tǒng)計(jì)該行所有黑像素的個(gè)數(shù)。設(shè)該行共有M個(gè)黑像素,則把該行從第一列到第M列置為黑。③顯示該圖。效果展示通過(guò)水平投影可以取得漢字所在的行數(shù),圖像投影處理效果如圖9-21所示。圖9-21水平投影可分割漢字所在的行數(shù)9.3.2垂直投影分割小結(jié)垂直投影分割是沿著圖像垂直方向,統(tǒng)計(jì)垂直方向像素的累加計(jì)算量的集合,通過(guò)垂直投影可以取得目標(biāo)物體所在的列數(shù)。實(shí)現(xiàn)步驟:①將圖像二值化,使物體為黑,背景為白。②循環(huán)各列,依次判斷每一行的像素值是否為黑,統(tǒng)計(jì)該列所有黑像素的個(gè)數(shù)。設(shè)該列共有M個(gè)黑像素,則把該列從第一行到第M行置為黑。③顯示該圖。效果展示圖像投影處理效果如圖9-22所示,垂直投影可獲得漢字所在的列數(shù),因此,垂直投影可以分割每個(gè)漢字。圖9-22垂直投影可以分割每個(gè)漢字9.4輪廓檢測(cè)9.4.1鄰域判斷法
掏空內(nèi)部點(diǎn)輪廓提取圖像邊緣是圖像局部特性不連續(xù)性(灰度突變、顏色突變等)的反映,它標(biāo)志著一個(gè)區(qū)域的終結(jié)和另一個(gè)區(qū)域的開始。二值圖像的輪廓提取采用掏空內(nèi)部點(diǎn)法:如果原圖中有一點(diǎn)為黑,且它的8個(gè)相鄰點(diǎn)皆為黑,則將該點(diǎn)刪除。對(duì)于非二值圖像,要先進(jìn)行二值化處理。1)獲取原圖像的首地址,圖像的高和寬。2)開辟一塊內(nèi)存緩沖區(qū)。3)將像素點(diǎn)的8鄰域像素讀入數(shù)組中,如果8個(gè)鄰域像素都和中心點(diǎn)相同,在內(nèi)存緩沖區(qū)中將該像素點(diǎn)置白,否則保持不變。4)重復(fù)執(zhí)行3),對(duì)每一個(gè)像素進(jìn)行處理。實(shí)現(xiàn)步驟(a)原圖(b)輪廓提取效果圖效果圖9.4.2邊界跟蹤法
從圖像中一個(gè)邊界點(diǎn)出發(fā),然后根據(jù)某種判別準(zhǔn)則搜索下一個(gè)邊界點(diǎn),以此跟蹤出目標(biāo)邊界。邊界跟蹤法小結(jié)中心像素可以跟蹤的方向有8個(gè),對(duì)每個(gè)方向制訂了方向編號(hào)及偏移量,當(dāng)找到起始點(diǎn),把該點(diǎn)記錄下來(lái),定義初始的跟蹤方向是左上方0方向,判斷該點(diǎn)是否為目標(biāo)點(diǎn),若是則把該目標(biāo)點(diǎn)作為跟蹤的起始點(diǎn),逆時(shí)針旋轉(zhuǎn)90度作為新的跟蹤方向,繼續(xù)檢測(cè)該新的跟蹤方向上的點(diǎn);若不是則沿順時(shí)針旋轉(zhuǎn)45度,直至找到目標(biāo)點(diǎn)。找到目標(biāo)點(diǎn)后,在當(dāng)前跟蹤方向的基礎(chǔ)上,逆時(shí)針旋轉(zhuǎn)90度作為新的跟蹤方向,用同樣的方法跟蹤下一個(gè)邊界點(diǎn),直到回到起始點(diǎn)為止。小結(jié)邊界跟蹤的基本方法是:先根據(jù)某些嚴(yán)格的“探測(cè)準(zhǔn)則”找出目標(biāo)物體輪廓上的像素,再根據(jù)這些像素的某些特征用一定的“跟蹤準(zhǔn)則”找出目標(biāo)物體上的其他像素。圖9-24邊界跟蹤示意圖確定邊界的起始搜索點(diǎn),起始點(diǎn)的選擇很關(guān)鍵,對(duì)某些圖像,選擇不同的起始點(diǎn)會(huì)導(dǎo)致不同的結(jié)果。
確定合適邊界判別準(zhǔn)則和搜索準(zhǔn)則,判別準(zhǔn)則用于判斷一個(gè)點(diǎn)是不是邊界點(diǎn),搜索準(zhǔn)則則指導(dǎo)如何搜索下一個(gè)邊緣點(diǎn)。
確定搜索的終止條件。邊界跟蹤法1)從左下角開始逐點(diǎn)掃描,當(dāng)遇到邊緣點(diǎn)時(shí),則跟蹤,直至跟后續(xù)點(diǎn)回到起始點(diǎn)(對(duì)于閉合線),或其后續(xù)點(diǎn)再?zèng)]有新的后續(xù)點(diǎn)(對(duì)于非閉合線)為止。2)如果為非閉合線,則跟蹤一側(cè)后,需從起始點(diǎn)開始朝相反的方向跟蹤到另一尾點(diǎn)。3)如果不止一個(gè)后續(xù)點(diǎn),則按上述連接準(zhǔn)則選擇距離最近的點(diǎn)為后續(xù)點(diǎn),另一次要的后續(xù)點(diǎn)作為新的邊緣跟蹤起點(diǎn)另行跟蹤。4)一條線跟蹤完后,接著掃描下一個(gè)未跟蹤點(diǎn),直至所有邊緣都跟蹤完畢。邊界跟蹤法--跟蹤準(zhǔn)則(a)中心像素跟蹤的8個(gè)方向編號(hào)及偏移量(b)邊界跟蹤示意圖(-1,-1)(0,-1)(1,-1)(-1,0)(1,0)(-1,1)(0,1)(1,1)邊界跟蹤法--跟蹤準(zhǔn)則
中心像素可以跟蹤的方向有8個(gè),對(duì)每個(gè)方向制定了方向編號(hào)及偏移量,選取圖像的最左下方的像素點(diǎn)作為起始點(diǎn)。邊界跟蹤法--跟蹤準(zhǔn)則當(dāng)找到起始點(diǎn),把該點(diǎn)記錄下來(lái);初始跟蹤方向是:左上方0方向;判斷該點(diǎn)是否為目標(biāo)點(diǎn),是則把該點(diǎn)為跟蹤的起始點(diǎn);逆時(shí)針旋轉(zhuǎn)90度,作為新的跟蹤方向,繼續(xù)檢測(cè)該新的跟蹤方向上的點(diǎn)。邊界跟蹤法--跟蹤準(zhǔn)則若不是是目標(biāo)點(diǎn)則沿順時(shí)針旋轉(zhuǎn)45度,一直到找到目標(biāo)點(diǎn)。找到目標(biāo)點(diǎn)后,在當(dāng)前跟蹤方向的基礎(chǔ)上,逆時(shí)針旋轉(zhuǎn)90度作為新的跟蹤方向,用同樣的方法跟蹤下一個(gè)邊界點(diǎn);直到回到起始點(diǎn)為止。
邊界跟蹤法--跟蹤準(zhǔn)則1)獲得圖像的首地址,圖像的高和寬。2)開辟一塊內(nèi)存緩沖區(qū),初始化為255。3)將圖像進(jìn)行二值化處理。4)跟蹤邊界點(diǎn),找到1個(gè)邊界點(diǎn),就將內(nèi)存緩沖區(qū)中該點(diǎn)置0。5)按照跟蹤準(zhǔn)則,重復(fù)執(zhí)行(4),直到回到初始點(diǎn)。實(shí)現(xiàn)步驟(a)原圖(b)外邊界跟蹤效果圖
效果圖9.4.3區(qū)域增長(zhǎng)法閾值分割法:很少考慮空間關(guān)系,使多閾值選擇受到限制。區(qū)域分割法:彌補(bǔ)這點(diǎn)不足,利用空間性質(zhì),認(rèn)為屬于同一區(qū)域的像素應(yīng)具有相似性。傳統(tǒng)的區(qū)域分割算法有:區(qū)域增長(zhǎng)法和區(qū)域分裂合并法。該類方法在先驗(yàn)知識(shí)不足的圖像進(jìn)行分割,有較好的性能。但是,空間和時(shí)間開銷比較大。區(qū)域增長(zhǎng)法
依次用圖像的每一個(gè)像素的灰度值和種子點(diǎn)相減,判斷結(jié)果是否小于標(biāo)準(zhǔn)差,是則將該點(diǎn)和種子點(diǎn)合并,不是則保持像素點(diǎn)的灰度值不變。這樣處理后的圖像就是用區(qū)域分割法處理后的邊緣分割圖像。區(qū)域增長(zhǎng)法考慮空間鄰域象素之間的關(guān)系。開始時(shí)確定一個(gè)或多個(gè)象素點(diǎn)作為種子,按某種相似性準(zhǔn)則,增長(zhǎng)區(qū)域,逐步生成具有某種均勻性的空間區(qū)域,將相鄰的具有相似性質(zhì)的象素或區(qū)域歸并,從而逐步增長(zhǎng)區(qū)域,直至沒(méi)有可以歸并的點(diǎn)或其它小區(qū)域?yàn)橹埂^(qū)域內(nèi)象素的相似性度量可以包括平均灰度值、紋理、顏色等信息。區(qū)域增長(zhǎng)法選擇合適的種子點(diǎn)確定相似性準(zhǔn)則(生長(zhǎng)準(zhǔn)則)確定生長(zhǎng)停止條件區(qū)域增長(zhǎng)法區(qū)域增長(zhǎng)法示意圖區(qū)域增長(zhǎng)法1)獲取原圖像的首地址,及高和寬。2)依次用圖像的每一個(gè)像素的灰度值減去種子點(diǎn),判斷結(jié)果的絕對(duì)值是否小于閾值,閾值為10。如果小于則將種子點(diǎn)賦給該像素點(diǎn),否則灰度值保持不變。實(shí)現(xiàn)步驟(a)選擇生長(zhǎng)點(diǎn)
(b)按右鍵點(diǎn)擊黑處效果圖效果圖小結(jié)將具有相似性質(zhì)的像素集合起來(lái)構(gòu)成區(qū)域。先找一個(gè)種子像素作為生長(zhǎng)起點(diǎn),然后將與種子像素有相同或相似性質(zhì)的像素合所在的區(qū)域中。將這些新像素當(dāng)作新的種子繼續(xù)上面的過(guò)程,直到?jīng)]有滿足條件
區(qū)域增長(zhǎng)法示意圖函數(shù)說(shuō)明(1)None=dWindow(winname[,flags])該函數(shù)是OpenCV中用于創(chuàng)建窗口的函數(shù),窗口通常用來(lái)顯示圖像。Winname:窗口名稱;Flags:可選參數(shù),例如有cv2.WINDOW_NORMAL、cv.WINDOW_AUTOSIZE等。(2)None=cv2.setMouseCallback(winname,onMouse,userdata)該函數(shù)是OpenCV中常需要用到的鼠標(biāo)回調(diào)函數(shù),以此實(shí)現(xiàn)人機(jī)交互。Winname:綁定的窗口名稱;OnMouse:鼠標(biāo)的回調(diào)函數(shù);Userdata:可選參數(shù)。函數(shù)說(shuō)明(3)在OpenCV中提供了cv2.circle()函數(shù)來(lái)繪制圓image=cv2.circle(image,center,radius,color[,thickness[,lineType]])image:表示繪制的載體圖像;center:表示圓心;radius:表示圓的半徑;color:表示繪制圓的線條的顏色;thickness:表示繪制圓的線條的粗細(xì);lineType:表示繪制圓的線條的類型。函數(shù)說(shuō)明(4)在OpenCV中提供了cv2.putText()函數(shù),用于在圖形上繪制文字mage=cv2.putText(image,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])image:表示繪制的載體圖像;text:表示要繪制的字體;org:表示繪制字體的位置;fontFace:表示字體類型;fontScale:表示字體大小;color:表示繪制文字的線條的顏色;thickness:表示繪制文字的線條的粗細(xì);lineType:表示繪制文字的線條的類型;bottomLeftOrigin:表示文字的方向。效果展示
圖9-27鼠標(biāo)單擊效果圖9.4.4輪廓檢測(cè)與擬合圖像的輪廓由一系列的點(diǎn)組成,這些點(diǎn)以某種方式表示圖像中的一條曲線。所以,圖像輪廓的繪制就是將檢測(cè)到的邊緣信息和圖像的前景信息進(jìn)行擬合,從而得到圖像的輪廓。在OpenCV中提供了cv2.findContours()和cv2.drawContours()函數(shù)來(lái)實(shí)現(xiàn)對(duì)圖像輪廓的查找與繪制,OpenCV中輪廓的查找與繪制函數(shù)說(shuō)明在OpenCV中提供了cv2.findContours()和cv2.drawContours()函數(shù)來(lái)實(shí)現(xiàn)對(duì)圖像輪廓的查找與繪制。(1)cv2.findContours()函數(shù)一般格式為:image,contours,hierarchy=cv2.findContours(image,mode,method)image:表示8位單通道原始圖像。mode:表示輪廓檢索模式。(2)cv2.drawContours()函數(shù)一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])函數(shù)說(shuō)明image:表示待繪制輪廓的圖像。contours:表示需要繪制的輪廓。contourIdx:表示需要繪制的邊緣索引。color:表示繪制的輪廓顏色。繪制的顏色,用BGR格式表示。thickness:表示繪制輪廓的粗細(xì)。如將該值設(shè)置為“-1”,則表示要繪制實(shí)心輪廓。lineType:表示繪制輪廓所選用的線型。hierarchy:對(duì)應(yīng)函數(shù)cv2.findContours()所輸出的層次信息。maxLevel:控制所繪制輪廓層次的深度。offset:表示輪廓的偏移程度。該參數(shù)使輪廓偏移到不同的位置展示出來(lái)。函數(shù)介紹cv2.findContours()函數(shù)的一般格式為:image,contours,hierarchy=cv2.findContours(image,mode,method)其中:·image表示8位單通道原始圖像?!ontours表示返回的輪廓?!ierarchy表示輪廓的層次信息?!ode表示輪廓檢索模式。·method表示輪廓的近似方法。cv2.drawContours()函數(shù)的一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])函數(shù)介紹cv2.drawContours()函數(shù)的一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])其中:·image表示待繪制輪廓的圖像?!ontours表示需要繪制的輪廓?!ontourIdx表示需要繪制的邊緣索引?!olor表示繪制的輪廓顏色?!hickness表示繪制輪廓的粗細(xì)?!ineType表示繪制輪廓所選用的線型?!ierarchy對(duì)應(yīng)cv2.findContours()函數(shù)中同樣參數(shù)的信息?!axLevel控制所繪制輪廓層次的深度。
繪制輪廓實(shí)例【例】繪制一幅圖像內(nèi)的輪廓。效果分析a是原始圖像;b是繪制圖1a中輪廓的結(jié)果;c是輪廓的信息??梢钥闯?,圖像共有8個(gè)輪廓信息,類型是列表。由于本書是黑白打印,為了觀察輪廓繪制效果,請(qǐng)上機(jī)測(cè)試?!纠?】利用查找繪制輪廓的方法提取出一幅圖像的前景信息。效果分析a是原始圖像;b是通過(guò)cv.findContours()函數(shù)和cv.draw-Contours()函數(shù)繪制的輪廓;c是通過(guò)掩模提取的前景信息。效果展示
(a)原圖(b)輪廓繪制(c)Mask圖
效果展示
(d)提取的前景(e)Canny檢測(cè)的邊緣(f)繪制的邊緣信息
9.5目標(biāo)物體測(cè)量9.5.1區(qū)域標(biāo)記二值圖像區(qū)域標(biāo)記在二值圖像中,相互聯(lián)結(jié)的黑像素集合成為一個(gè)(黑)區(qū)域。通過(guò)對(duì)圖像內(nèi)每個(gè)區(qū)域進(jìn)行標(biāo)記操作,求得區(qū)域的數(shù)目。處理前的f是二值的,像素要么為0(黑),要么為255(白),處理后每個(gè)像素的值即為其所處理區(qū)域的區(qū)域標(biāo)號(hào)(1,2,3,…)。從左到右,從上倒下逐個(gè)像素掃描。若該點(diǎn)的左上、正上、右上及左前點(diǎn)都不為物體,則標(biāo)號(hào)加1。優(yōu)先級(jí)依次為右上點(diǎn),正上點(diǎn),左上點(diǎn)及左前點(diǎn)。右上點(diǎn)的優(yōu)先級(jí)最高,左前的優(yōu)先級(jí)最低。若右上點(diǎn)為物體,則當(dāng)前點(diǎn)標(biāo)記和右上點(diǎn)相同的值。若右上點(diǎn)不為物體,則判斷正上點(diǎn)。標(biāo)記準(zhǔn)則其中特別調(diào)整:當(dāng)前點(diǎn)的右上點(diǎn)及左前點(diǎn)為不同標(biāo)記,正上點(diǎn)和左上點(diǎn)不為物體,則當(dāng)前點(diǎn)標(biāo)記同右上點(diǎn)置相同的值。此時(shí),從頭到尾掃描圖像,把所有標(biāo)記相同的像素值都標(biāo)記成與右上點(diǎn)同樣的值。標(biāo)記準(zhǔn)則1)讀入原圖數(shù)據(jù),存放在緩沖區(qū)內(nèi)。2)根據(jù)輸入的閾值進(jìn)行二值化。3)從左到右,從上倒下,依次檢測(cè)每個(gè)像素,如果發(fā)現(xiàn)某像素點(diǎn)像素值為0,則依次檢測(cè)該點(diǎn)的右上、正上、左上及左前點(diǎn)共四個(gè)點(diǎn)的像素值,根據(jù)前面介紹的8個(gè)準(zhǔn)則進(jìn)行連通性的判斷,并標(biāo)識(shí)物體,將物體的像素值改為標(biāo)號(hào)。4)依次逐行檢測(cè)至掃描結(jié)束。實(shí)現(xiàn)步驟(a)原圖
(b)對(duì)物體加標(biāo)記圖
效果圖函數(shù)說(shuō)明(1)在OpenCV中可以通過(guò)cv2.moments()函數(shù)來(lái)獲取圖像的輪廓特征moments=cv2.moments(img,binaryImage=False)img:可以是灰度圖像或者二值圖像;binaryImage:表示輸入的二值圖像是否已經(jīng)是經(jīng)過(guò)二值化處理的。如果是,則傳入True,否則傳入False。moments:返回的矩特征。cv2.moments函數(shù)的返回值為一個(gè)字典,包含了圖像矩及其他信息。字典的鍵與矩的特征有關(guān),例如中心矩、二階矩等。m00=moments['m00'] #面積cx=moments['m10']/moments['m00'] #x坐標(biāo)cy=moments['m01']/moments['m00'] #y坐標(biāo)其中,m00表示圖像的面積,cx和cy分別表示圖像的重心。效果展示9.5.2面積測(cè)量9.4.2二值圖像的區(qū)域面積測(cè)量在二值圖像f中,通過(guò)對(duì)圖像f內(nèi)每個(gè)像素進(jìn)行標(biāo)記操作,將物體的像素值改為標(biāo)號(hào),求各種標(biāo)號(hào)的總和,即求得不同區(qū)域的面積數(shù)目。1)調(diào)用標(biāo)記統(tǒng)計(jì)函數(shù),對(duì)圖像進(jìn)行標(biāo)記,劃分成不同的連通區(qū)域。2)循環(huán)取得各點(diǎn)像素值,像素值就是標(biāo)號(hào)。3)根據(jù)不同的標(biāo)號(hào),加到對(duì)應(yīng)的數(shù)組。4)彈出對(duì)話框,輸出各個(gè)連通區(qū)域的面積(像素個(gè)數(shù))。實(shí)現(xiàn)步驟面積測(cè)量效果圖在OpenCV中,cv2.contourArea()函數(shù)可以用于計(jì)算輪廓的面積,其一般格式為:retval=cv2.contourArea(contour[,booled])retval:表示返回的輪廓面積;contour:表示輸入的輪廓;booled:表示輪廓的封閉性。函數(shù)說(shuō)明效果展示9.5.3周長(zhǎng)測(cè)量9.4.3二值圖像的周長(zhǎng)測(cè)量在二值圖像區(qū)域標(biāo)記的基礎(chǔ)上,物體的像素值改為標(biāo)號(hào),再采用邊界跟蹤法,跟蹤各封閉區(qū)域邊界線(輪廓線)的每個(gè)黑像素的標(biāo)號(hào),記錄二值圖像物體邊界。1)調(diào)用biaoji()函數(shù),對(duì)圖像進(jìn)行標(biāo)記,劃分成不同的連通區(qū)域。2)根據(jù)不同的像素值,即不同的連通區(qū),循環(huán)取得各點(diǎn)像素值的標(biāo)號(hào),搜索出一個(gè)發(fā)點(diǎn),利用7.3.2節(jié)介紹的邊界跟蹤法,采用Lunkuogenzong()函數(shù),找到出發(fā)點(diǎn)后,記錄其坐標(biāo),再跟蹤下一像素。保留循環(huán)得到的邊界點(diǎn),其余都置255(白點(diǎn))。實(shí)現(xiàn)步驟3)根據(jù)不同的像素值,即不同的連通區(qū),依次執(zhí)行第2步。4)把緩沖區(qū)的數(shù)據(jù)返回到原數(shù)據(jù)區(qū)。5)調(diào)整連通邊界區(qū),計(jì)算每個(gè)連通邊界區(qū)的周長(zhǎng)(像素個(gè)數(shù))。6)彈出對(duì)話框,輸出各個(gè)邊界連通區(qū)域的像素個(gè)數(shù)。實(shí)現(xiàn)步驟周長(zhǎng)計(jì)算效果圖
(a)原圖
(b)對(duì)不同區(qū)域體標(biāo)識(shí)圖(c)區(qū)域面積測(cè)量圖(d)區(qū)域周長(zhǎng)測(cè)量圖效果圖函數(shù)說(shuō)明在OpenCV中,函數(shù)cv2.arcLength()可以用于計(jì)算輪廓的長(zhǎng)度,其一般格式為:retval=cv2.arcLength(contour,booled)其中:retval:表示返回的輪廓周長(zhǎng);contour:表示輸入的輪廓;booled:表示輪廓的封閉性。效果展示圖9-35周長(zhǎng)計(jì)算效果圖在OpenCV中,當(dāng)查找并繪制出圖像的輪廓后,可以通過(guò)cv2.arcLength()函數(shù)和cv2.contourArea()函數(shù)計(jì)算輪廓的周長(zhǎng)與面積。在OpenCV中,函數(shù)cv2.arcLength()可以用于計(jì)算輪廓的長(zhǎng)度,其一般格式為:ret=cv2.arcLength(contour,booled)其中:·ret表示返回的輪廓周長(zhǎng)?!ontour表示輸入的輪廓?!ooled表示輪廓的封閉性。OpenCV中輪廓的周長(zhǎng)與面積9.2.1
周長(zhǎng)計(jì)算:cv2.arcLength()函數(shù)【】計(jì)算并顯示一幅圖像中的輪廓長(zhǎng)度。運(yùn)行結(jié)果a是原始圖像,其中有8個(gè)各種各樣的圖形;b是原始圖像中各個(gè)圖形的周長(zhǎng)。面積計(jì)算:cv2.contourArea()函數(shù)在OpenCV中,cv2.contourArea()函數(shù)可以用于計(jì)算輪廓的面積,其一般格式為:ret=cv2.contourArea(contour[,booled])其中:·ret表示返回的輪廓面積?!ontour表示輸入的輪廓?!ooled表示輪廓的封閉性?!纠?】計(jì)算并顯示一幅圖像中的輪廓面積。運(yùn)行結(jié)果a是原始圖像,其中有8個(gè)圖形;b是原始圖像中各個(gè)圖形的面積。9.6最小外包形狀檢測(cè)在通過(guò)之前的閾值分割和邊緣檢測(cè)后,可以獲得一幅圖像的前景或邊緣。接下來(lái),一般是通過(guò)擬合的方式獲取可以近似這些圖像輪廓的多邊形或者最小外包,為之后的模板匹配打下一定的基礎(chǔ)。幾何圖形的最小外包與擬合9.6.1最小外包矩形cv2.minAreaRect()函數(shù)用來(lái)繪制輪廓的最小外包矩形框,其一般格式為:ret=cv2.minAreaRect(points)其中:·ret表示返回的矩形特征信息?!oints表示輸入的輪廓。注意返回值ret的結(jié)構(gòu)不符合cv2.drawContours()函數(shù)的參數(shù)結(jié)構(gòu)要求。因此必須用cv2.boxPoints()函數(shù)將上述返回值ret轉(zhuǎn)換為符合要求的結(jié)構(gòu)。cv2.boxPoints()函數(shù)的一般格式是:points=cv2.boxPoints(box)其中:·box表示cv2.minAreaRect()函數(shù)返回值類型的值?!oints表示返回的符合結(jié)構(gòu)的矩形特征信息?!纠?】利用cv2.minAreaRect()函數(shù)得到圖像的最小外包矩形框。運(yùn)行結(jié)果圖6a是原始圖像;圖6b是在原始圖像上繪制的最小矩形外包的圖像。9.6.2最小外包圓形在OpenCV中提供了cv2.minEnclosingCircle()函數(shù)來(lái)繪制輪廓的最小外包圓形,其一般格式為:center,radius=cv2.minEnclosingCircle(points)其中:·center表示最小外包圓形的中心?!adius表示最小外包圓形的半徑?!oints表示輸入的輪廓。【例7】利用cv2.minEnclosingCircle()函數(shù)得到圖像的最小外包圓形。運(yùn)行結(jié)果9.6.3最小外包三角形在OpenCV中提供了cv2.minEnclosingTriangle()函數(shù)來(lái)繪制輪廓的最小外包三角形,其一般格式為:ret,triangle=cv2.minEnclosingTriangle(points)其中:·ret表示最小外包三角形的面積?!riangle表示最小外包三角形的三個(gè)頂點(diǎn)集?!oints表示輸入的輪廓?!纠?】利用cv2.minEnclosingTriangle()函數(shù)得到圖像的最小外包三角形。運(yùn)行結(jié)果9.6.4最小外包橢圓在OpenCV中提供了cv2.fitEllipse()函數(shù)來(lái)繪制輪廓的最小外包橢圓,其一般格式為:ret=cv2.fitEllipse(points)其中:·ret表示返回的橢圓特征信息,包括中心點(diǎn)、軸長(zhǎng)度和旋轉(zhuǎn)角等。·points表示輸入的輪廓?!纠?】利用cv2.fitEllipse()函數(shù)得到圖像的最小外包橢圓。運(yùn)行結(jié)果9.3.5最優(yōu)擬合直線在OpenCV中提供了cv2.fitLine()函數(shù)來(lái)繪制輪廓的最優(yōu)擬合直線,其一般格式為:line=cv2.fitLine(points,distType,param,reps,aeps)其中:·line表示返回的最優(yōu)擬合直線參數(shù)?!oints表示輸入的輪廓?!istType表示距離類型?!aram表示距離參數(shù),與所用距離類型相關(guān)?!eps表示最優(yōu)擬合直線的徑向精度,一般為0.01?!eps表示最優(yōu)擬合直線的角度精度,一般為0.01。【例10】利用cv2.fitLine()函數(shù)得到圖像的最優(yōu)擬合直線。運(yùn)行結(jié)果9.7霍夫檢測(cè)霍夫變換于1962年由PaulHough首次提出,霍夫變換運(yùn)用兩個(gè)坐標(biāo)空間之間的變換將在一個(gè)空間中具有相同形狀的曲線或直線映射到另一個(gè)坐標(biāo)空間的一個(gè)點(diǎn)上形成峰值,從而把檢測(cè)任意形狀的問(wèn)題轉(zhuǎn)化為統(tǒng)計(jì)峰值問(wèn)題。9.7霍夫檢測(cè)9.7.1霍夫直線檢測(cè)小結(jié)霍夫變換(HoughTransform)的原理是將特定圖形上的點(diǎn)變換到一組參數(shù)空間上,根據(jù)參數(shù)空間點(diǎn)的累計(jì)結(jié)果找到一個(gè)極大值對(duì)應(yīng)的解,那么這個(gè)解就對(duì)應(yīng)著要尋找的幾何形狀的。圖9-40極坐標(biāo)系下的直線方程(1)極坐標(biāo)系下的直線方程ρ
=
xcosθ
+
ysinθ(9-21)(2)極坐標(biāo)系中的一點(diǎn)對(duì)應(yīng)θ從0~2π變化的直線(3)θ角度由1°逐漸遞增可獲取對(duì)應(yīng)的直線參數(shù)ρ(4)同一條直線上的點(diǎn),對(duì)應(yīng)相同的(ρ,θ)圖9-40極坐標(biāo)系下的直線方程(5)參數(shù)空間(θ,ρ)量化,構(gòu)建累加器矩陣,統(tǒng)計(jì)相同(θ,ρ)的出現(xiàn)次數(shù)霍夫直線檢測(cè),就是將參數(shù)空間(θ,ρ)量化成m×n(m為θ的等份數(shù),n為ρ的等份數(shù))個(gè)單元。小結(jié)算法流程:①首先就是對(duì)圖像進(jìn)行Canny邊緣提取;②將參數(shù)空間(θ,ρ)量化成m×n個(gè)單元,并設(shè)置累加器矩陣Q[m×n],并把累加器的初始值置為零;③將每一個(gè)邊緣點(diǎn)的直角坐標(biāo)系代入式ρ=xcosθ+ysinθ,然后將θ0~θm?1?也都代入其中,分別計(jì)算出相應(yīng)的值ρj;④在參數(shù)空間中,找到每一個(gè)Q(θi,ρj)所對(duì)應(yīng)的單元,并將該單元的累加器加1;⑤待圖像xy坐標(biāo)系中的所有點(diǎn)都進(jìn)行運(yùn)算之后,檢查參數(shù)空間的累加器,指定一個(gè)閾值,輸出多條直線。函數(shù)說(shuō)明(1)cv2.HoughLines()函數(shù)來(lái)實(shí)現(xiàn)標(biāo)準(zhǔn)霍夫直線檢測(cè),lines=cv2.HoughLines(image,rho,theta,threshold)lines:表示函數(shù)的返回值,是檢測(cè)到的直線參數(shù);image:表示輸入的8位單通道二值圖像;rho:表示距離的精度,一般為1;theta:表示角度的精度,一般為π/180;threshold:表示判斷閾值。效果展示
(a)原圖(b)Canny邊緣檢測(cè)
(c)霍夫直線檢測(cè)結(jié)果(d)繪制效果圖9-42霍夫直線檢測(cè)效果圖OpenCV中霍夫直線檢測(cè)在OpenCV中提供了cv2.HoughLines()函數(shù)來(lái)實(shí)現(xiàn)標(biāo)準(zhǔn)霍夫直線檢測(cè),其一般格式為:lines=cv2.HoughLines(image,rho,theta,threshold)其中:·lines表示函數(shù)的返回值,是檢測(cè)到的直線參數(shù)?!mage表示輸入的8位單通道二值圖像?!ho表示距離的精度,一般為1?!heta表示角度的精度,一般為π/180?!hreshold表示判斷閾值。注意在使用該函數(shù)進(jìn)行霍夫直線檢測(cè)時(shí),所檢測(cè)到的是圖像中的直線而不是線段。1.標(biāo)準(zhǔn)霍夫直線檢測(cè):霍夫直線檢測(cè)在使用標(biāo)準(zhǔn)霍夫直線檢測(cè)時(shí),雖然可以檢測(cè)出圖像中的直線,但是會(huì)出現(xiàn)很多重復(fù)的檢測(cè)直線,為了解決這種問(wèn)題,有學(xué)者提出了概率霍夫變換。這是一種對(duì)霍夫變換的優(yōu)化,它只需要一個(gè)足以進(jìn)行線檢測(cè)的隨機(jī)點(diǎn)子集即可。在OpenCV中提供了cv2.HoughLinesP()函數(shù)來(lái)實(shí)現(xiàn)概率霍夫直線檢測(cè),其一般格式為:lines=cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)其中:·lines表示函數(shù)的返回值,是檢測(cè)到的直線參數(shù)?!mage表示輸入的8位單通道二值圖像?!ho表示距離的精度,一般為1。·theta表示角度的精度,一般為π/180?!hreshold表示判斷閾值?!inLineLength用來(lái)控制所接受直線的最小長(zhǎng)度?!axLineGap用來(lái)控制共線線段之間的最大間隔。2.霍夫直線檢測(cè):【例11】使用cv2.Ho
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024幼兒園建設(shè)項(xiàng)目節(jié)能燈具供應(yīng)與施工合同3篇
- 2024年鐵路、水路貨物運(yùn)輸聯(lián)合保險(xiǎn)單
- 2025年度智慧旅游平臺(tái)建設(shè)合同3篇
- 2025年度智能房產(chǎn)交易財(cái)產(chǎn)保全申請(qǐng)書范本3篇
- 2024年運(yùn)動(dòng)場(chǎng)改造項(xiàng)目施工廢棄物處理合同3篇
- 2024年起重機(jī)租賃及安裝指導(dǎo)合同3篇
- 2024年高端裝備維修與技術(shù)保障服務(wù)合同
- 2024年綠色建筑地產(chǎn)項(xiàng)目前期策劃及環(huán)保評(píng)估合同2篇
- 2025年度新能源設(shè)備承攬工程合同范本2篇
- 2024年蒸壓加氣混凝土砌塊廣告宣傳與推廣合同
- 2025年中國(guó)CAR-T免疫細(xì)胞治療行業(yè)市場(chǎng)發(fā)展前景研究報(bào)告-智研咨詢發(fā)布
- 2024-2025學(xué)年陜旅版英語(yǔ)五年級(jí)上冊(cè)期末質(zhì)量檢測(cè)5(含答案含聽力原文無(wú)音頻)
- 民宿承包協(xié)議書2025年
- YY/T 1409-2016等離子手術(shù)設(shè)備
- 設(shè)計(jì)風(fēng)速、覆冰的基準(zhǔn)和應(yīng)用
- 水果深加工項(xiàng)目商業(yè)計(jì)劃書范文參考
- 基于單片機(jī)的室內(nèi)環(huán)境檢測(cè)系統(tǒng)設(shè)計(jì)開題報(bào)告
- 愛(ài)麗絲夢(mèng)游仙境話劇中英文劇本
- 中英文驗(yàn)貨報(bào)告模板
- 五年級(jí)上冊(cè)人教版數(shù)學(xué)脫式計(jì)算題五年級(jí)上冊(cè)脫式計(jì)算,解方程,應(yīng)用題
- 東汪鎮(zhèn)中學(xué)對(duì)標(biāo)活動(dòng)實(shí)施實(shí)施方案
評(píng)論
0/150
提交評(píng)論