在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

二值圖像的歐拉數(shù)計(jì)算公式

OpenCV學(xué)堂 ? 來(lái)源:OpenCV學(xué)堂 ? 作者:OpenCV學(xué)堂 ? 2022-06-30 11:08 ? 次閱讀

歐拉數(shù)定義

二值圖像分析中歐拉數(shù)重要的拓?fù)涮卣髦唬趫D像分析與幾何對(duì)象識(shí)別中有著十分重要的作用,二值圖像的歐拉數(shù)計(jì)算公式表示如下:
E = N – H 其中
E表示計(jì)算得到歐拉數(shù)
N表示聯(lián)通組件的數(shù)目
H表示在聯(lián)通組件內(nèi)部的洞的數(shù)目
下圖是二值圖像,白色背景,兩個(gè)對(duì)象、分析計(jì)算得到歐拉數(shù)的例子:

01d926cc-f7bf-11ec-ba43-dac502259ad0.png

可以看到通過(guò)簡(jiǎn)單的歐拉數(shù)屬性就可以對(duì)它們進(jìn)行區(qū)分。左側(cè)對(duì)象中有兩個(gè)聯(lián)通區(qū)域,所以N=2,沒(méi)有洞孔區(qū)域,所以H=0, 計(jì)算得到歐拉數(shù)目為 2 – 0 = 。右側(cè)是大寫(xiě)字母B,它只有一個(gè)聯(lián)通區(qū)域所以N = 1, 內(nèi)部有兩個(gè)洞孔區(qū)域所以H = 2,最終計(jì)算得到歐拉數(shù)為 2 – 1 = -1。對(duì)于任意一個(gè)幾何形狀來(lái)說(shuō),如果我們要求得它的歐拉數(shù),就首先要分析它的輪廓結(jié)構(gòu),然后根據(jù)輪廓層次結(jié)構(gòu)計(jì)算得到N與H值。

歐拉數(shù)是圖像幾何識(shí)別中重要的屬性,舉例如下圖中三個(gè)英文字母

01f57b74-f7bf-11ec-ba43-dac502259ad0.png?對(duì)字母A來(lái)說(shuō)它的內(nèi)部有一個(gè)黑色孔洞,所以它的H=1,其本身是一個(gè)聯(lián)通組件所以N =1,最終計(jì)算得到歐拉數(shù)為 E = 1 -1 = 0,同樣可以計(jì)算B與C它們的歐拉數(shù)分布為-1與1,可見(jiàn)通過(guò)歐拉數(shù)屬性可以輕而易舉的區(qū)分ABC三個(gè)英文字母。

二:輪廓層次信息獲取

在OpenCV對(duì)二值圖像進(jìn)行輪廓分析輸出的層次結(jié)構(gòu)會(huì)保存在一個(gè)Vec4i的結(jié)構(gòu)體中,這里有必要首先看一下輪廓發(fā)現(xiàn)API及其相關(guān)參數(shù)的解釋:

voidcv::findContours(
InputOutputArrayimage,
OutputArrayOfArrayscontours,
OutputArrayhierarchy,
intmode,
intmethod,
Pointoffset=Point()
)
image參數(shù)表示輸入的二值圖像
contours表示所有的輪廓信息,每個(gè)輪廓是一系列的點(diǎn)集合
hierarchy表示對(duì)應(yīng)的每個(gè)輪廓的層次信息,我們就是要用它實(shí)現(xiàn)對(duì)最大輪廓?dú)W拉數(shù)的分析
mode表示尋找輪廓拓?fù)涞姆椒ǎ绻獙ふ彝暾膶哟涡畔ⅲx擇參數(shù)RETR_TREE
method表示輪廓的編碼方式,一般選擇簡(jiǎn)單鏈?zhǔn)骄幋a,參數(shù)CHAIN_APPROX_SIMPLE
offset表示是否有位移,一般默認(rèn)是0

上面的參數(shù)中最重要的是hierarchy信息,它的輸出是vector每個(gè)輪廓對(duì)應(yīng)的Vec4i結(jié)構(gòu)體里面四個(gè)值解釋如下:

02138222-f7bf-11ec-ba43-dac502259ad0.png

上面的索引如果是負(fù)數(shù)就表示沒(méi)有相關(guān)層次信息,如果是非負(fù)數(shù)就表示有相關(guān)的層次關(guān)系信息。此外輪廓發(fā)現(xiàn)函數(shù)對(duì)輸入image圖像的要求必須滿足

  • 背景是黑色 ,0表示

  • 對(duì)象或者前景是白色,1表示

三:歐拉數(shù)計(jì)算方法

有了輪廓的層次信息與每個(gè)輪廓的信息之后,嘗試遍歷每個(gè)輪廓,首先通過(guò)調(diào)用findContours就可以獲取二值圖像的輪廓層次信息,然后遍歷每個(gè)輪廓,進(jìn)行層次遍歷,獲得每層子輪廓的總數(shù),最終根據(jù)輪廓層級(jí)不同分為孔洞與連接輪廓的計(jì)數(shù),二者想減得到每個(gè)獨(dú)立外層輪廓的歐拉數(shù)。

二值化與輪廓發(fā)現(xiàn)的代碼如下:

Matgray,binary;
cvtColor(src,gray,COLOR_BGR2GRAY);
threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU);
vectorhireachy;
vector<vector>contours;
findContours(binary,contours,hireachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());

獲取同層輪廓的代碼如下:

vector<int>current_layer_holes(vector<Vec4i>layers,intindex){
intnext=layers[index][0];
vector<int>indexes;
indexes.push_back(index);
while(next>=0){
indexes.push_back(next);
next=layers[next][0];
}
returnindexes;
}

使用隊(duì)列迭代尋找遍歷每層的代碼如下:

while(!nodes.empty()){
//當(dāng)前層總數(shù)目
if(index%2==0){//聯(lián)通組件對(duì)象
n_total+=nodes.size();
}
else{//孔洞對(duì)象
h_total+=nodes.size();
}
index++;
//計(jì)算下一層所有孩子節(jié)點(diǎn)
intcurr_ndoes=nodes.size();
for(intn=0;nintvalue=nodes.front();
nodes.pop();
//獲取下一層節(jié)點(diǎn)第一個(gè)孩子
intchild=hireachy[value][2];
if(child>=0){
nodes.push(child);
}
}
}

四:運(yùn)行與測(cè)試結(jié)果

測(cè)試圖一(ABC)與運(yùn)行結(jié)果:

022be9de-f7bf-11ec-ba43-dac502259ad0.jpg

測(cè)試圖二與運(yùn)行結(jié)果

024b4b1c-f7bf-11ec-ba43-dac502259ad0.jpg

五:完整源代碼

#include
#include

usingnamespacecv;
usingnamespacestd;

vector<int>current_layer_holes(vectorlayers,intindex);

intmain(intargc,char**argv){
Matsrc=imread("D:/holes.png");
if(src.empty()){
printf("couldnotloadimage...
");
return-1;
}
namedWindow("input",CV_WINDOW_AUTOSIZE);
imshow("input",src);

Matgray,binary;
cvtColor(src,gray,COLOR_BGR2GRAY);
threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU);

vectorhireachy;
vector<vector>contours;
findContours(binary,contours,hireachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
Matresult=Mat::zeros(src.size(),src.type());
for(size_tt=0;tintnext=hireachy[t][0];//nextatthesamehierarchicallevel
intprev=hireachy[t][1];//prevatthesamehierarchicallevel
intchild=hireachy[t][2];//firstchild
intparent=hireachy[t][3];//parent
printf("next%d,previous%d,children:%d,parent:%d
",next,prev,child,parent);
drawContours(result,contours,t,Scalar(0,255,0),2,8);
//startcalculateeulernumber
inth_total=0;
intn_total=1;
intindex=1;
vector<int>all_children;
if(child>=0&&parent0){
//計(jì)算當(dāng)前層
queue<int>nodes;
vector<int>indexes=current_layer_holes(hireachy,child);
for(inti=0;iwhile(!nodes.empty()){
//當(dāng)前層總數(shù)目
if(index%2==0){//聯(lián)通組件對(duì)象
n_total+=nodes.size();
}
else{//孔洞對(duì)象
h_total+=nodes.size();
}
index++;
//計(jì)算下一層所有孩子節(jié)點(diǎn)
intcurr_ndoes=nodes.size();
for(intn=0;nintvalue=nodes.front();
nodes.pop();
//獲取下一層節(jié)點(diǎn)第一個(gè)孩子
intchild=hireachy[value][2];
if(child>=0){
nodes.push(child);
}
}
}
printf("holenumber:%d
",h_total);
printf("connectionnumber:%d
",n_total);
//計(jì)算歐拉數(shù)
inteuler_num=n_total-h_total;
printf("numberofeuler:%d
",euler_num);
drawContours(result,contours,t,Scalar(0,0,255),2,8);
//顯示歐拉數(shù)
Rectrect=boundingRect(contours[t]);
putText(result,format("euler:%d",euler_num),rect.tl(),FONT_HERSHEY_SIMPLEX,1.0,Scalar(255,255,0),2,8);
}
if(child0&&parent0){
printf("holenumber:%d
",h_total);
printf("connectionnumber:%d
",n_total);
inteuler_num=n_total-h_total;
printf("numberofeuler:%d
",euler_num);
drawContours(result,contours,t,Scalar(255,0,0),2,8);
Rectrect=boundingRect(contours[t]);
putText(result,format("euler:%d",euler_num),rect.tl(),FONT_HERSHEY_SIMPLEX,1.0,Scalar(255,255,0),2,8);
}

}

imshow("result",result);
waitKey(0);
return0;
}

vector<int>current_layer_holes(vectorlayers,intindex){
intnext=layers[index][0];
vector<int>indexes;
indexes.push_back(index);
while(next>=0){
indexes.push_back(next);
next=layers[next][0];
}
returnindexes;
}

PS:代碼未經(jīng)更多嚴(yán)格測(cè)試,僅供參考!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 二值圖像
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    8766
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41559
  • 歐拉
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    1841

原文標(biāo)題:OpenCV輪廓層次分析實(shí)現(xiàn)歐拉數(shù)計(jì)算

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電工常用的計(jì)算公式

    電工常用的計(jì)算公式,幫助大家更好地理解和解決這些問(wèn)題。 1、歐姆定律、焦耳定律、電功率、電能 首先,我們來(lái)看看歐姆定律。歐姆定律是電學(xué)的基礎(chǔ)定律之一,它描述了電流、電壓和電阻之間的關(guān)系。歐姆定律的公式為:I=V/R,
    的頭像 發(fā)表于 01-21 09:32 ?249次閱讀
    電工常用的<b class='flag-5'>計(jì)算公式</b>

    LM567C的真正的中心頻率計(jì)算公式是什么?

    1、LM567C的datasheet中,中心頻率的計(jì)算公式為:f0=1.1/RC,而LM567C的百度百科中,中心頻率的計(jì)算公式為:f0=1/1.1RC,那么LM567C的真正的中心頻率計(jì)算公式
    發(fā)表于 12-13 07:23

    TDC1000的測(cè)量范圍計(jì)算公式是什么?

    TDC1000的測(cè)量范圍計(jì)算公式是什么
    發(fā)表于 12-10 06:19

    云端彈性計(jì)算公式有哪些內(nèi)容?

    云端彈性計(jì)算公式有哪些內(nèi)容?云端彈性計(jì)算公式涵蓋資源分配、性能監(jiān)控、自動(dòng)伸縮及積分計(jì)算等方面。資源分配依據(jù)虛擬機(jī)配置和實(shí)際需求動(dòng)態(tài)調(diào)整;性能監(jiān)控實(shí)時(shí)監(jiān)控CPU、內(nèi)存等關(guān)鍵指標(biāo);自動(dòng)伸縮根據(jù)預(yù)設(shè)閾值
    的頭像 發(fā)表于 11-15 11:04 ?235次閱讀

    平衡流量計(jì)計(jì)算公式

    流量計(jì)計(jì)算公式的重要性及應(yīng)用你了解嗎? 一、管道流速公式 這是平衡流量計(jì)中最基本的計(jì)算公式之一,它基于流體的質(zhì)量守恒定律。通過(guò)測(cè)量管道中的壓力差和密度,可以計(jì)算出流體的流速。
    的頭像 發(fā)表于 10-25 14:14 ?283次閱讀
    平衡流量計(jì)<b class='flag-5'>計(jì)算公式</b>

    VCA820的增益計(jì)算公式是什么?

    我看了手冊(cè),貌似VCA820沒(méi)有給出增益計(jì)算公式,請(qǐng)解答!!謝謝
    發(fā)表于 09-26 06:43

    工業(yè)鏡頭焦距計(jì)算公式

    掌握工業(yè)鏡頭焦距計(jì)算公式是確保工業(yè)視覺(jué)系統(tǒng)高效、準(zhǔn)確運(yùn)行的重要一步。
    的頭像 發(fā)表于 09-25 16:36 ?982次閱讀
    工業(yè)鏡頭焦距<b class='flag-5'>計(jì)算公式</b>

    請(qǐng)問(wèn)VCA820的增益計(jì)算公式是什么?

    VCA820的增益計(jì)算公式是什么?就是輸入與增益之間的計(jì)算公式。官網(wǎng)資料里面好像沒(méi)有介紹,不知道是不是我看的不夠仔細(xì)
    發(fā)表于 09-06 08:04

    INA214A-Q1輸入、輸出計(jì)算公式是什么?

    INA214A-Q1數(shù)據(jù)手冊(cè)上沒(méi)有輸入、輸出計(jì)算公式
    發(fā)表于 08-13 06:54

    請(qǐng)問(wèn)INA240 Vout的計(jì)算公式是什么?

    按照手冊(cè)的這種接法,將輸出設(shè)置成外部基準(zhǔn)電壓。Vout的計(jì)算公式是什么呢?我猜測(cè)Vout=VIN*GAIN+Vref,不知道是不是這樣的?
    發(fā)表于 07-26 06:54

    微變等效電路rbe的計(jì)算公式

    微變等效電路中的rbe是一個(gè)重要的參數(shù),它代表了三極管的輸入電阻,對(duì)于分析三極管的交流性能具有重要意義。關(guān)于rbe的計(jì)算公式,有多種表述方式,但核心思想是一致的。以下是對(duì)rbe計(jì)算公式的解析: 1.
    的頭像 發(fā)表于 07-15 10:55 ?9496次閱讀

    LLC諧振半橋工作原理(LLC變壓器計(jì)算公式)

    L6599-LLC諧振半橋工作原理(LLC變壓器計(jì)算公式)
    發(fā)表于 06-18 09:20 ?26次下載

    示波器周期的計(jì)算公式

    示波器作為電子測(cè)量領(lǐng)域的重要工具,其能夠直觀地顯示電壓信號(hào)隨時(shí)間變化的波形,對(duì)于電路分析、信號(hào)檢測(cè)等領(lǐng)域具有不可替代的作用。在示波器的使用中,我們經(jīng)常需要計(jì)算信號(hào)的周期,以了解信號(hào)的特性。本文將詳細(xì)介紹示波器周期的計(jì)算公式及其應(yīng)用,并通過(guò)實(shí)例進(jìn)行說(shuō)明,以期為讀者提供更為深
    的頭像 發(fā)表于 05-17 17:25 ?2779次閱讀

    超級(jí)電容儲(chǔ)能密度的計(jì)算公式

    。然而,要全面理解和應(yīng)用超級(jí)電容器,我們首先需要掌握其儲(chǔ)能密度的計(jì)算公式。本文將詳細(xì)探討超級(jí)電容儲(chǔ)能密度的計(jì)算公式,并對(duì)其相關(guān)參數(shù)進(jìn)行深入解析。
    的頭像 發(fā)表于 05-17 15:58 ?2120次閱讀

    電能的計(jì)算公式 電能的計(jì)算公式中時(shí)間的單位

    電能是電力消耗的度量,它表示單位時(shí)間內(nèi)消耗的電功率。電能的計(jì)算公式為: 電能(E)= 電功率(P)× 時(shí)間(t) 其中,電功率可以通過(guò)以下公式計(jì)算: 電功率(P)= 電壓(U)× 電流(I) 通過(guò)
    的頭像 發(fā)表于 02-22 10:00 ?1.6w次閱讀
    主站蜘蛛池模板: 亚洲高清日韩精品第一区 | 欧美一区二区三区成人看不卡 | 黄色短视频软件 | 国产69精品久久久久9牛牛 | 乱子伦xxx欧美 | 亚洲最大色网 | 免费观看成人毛片 | 亚洲国产色图 | 色天使在线观看 | 毛片在线播放网站 | 在线黄色网| 日日噜噜夜夜狠狠va视频 | 夜夜操夜夜摸 | 8888四色奇米在线观看不卡 | 中文在线最新版天堂bt | 给我免费播放片黄色 | 日本巨黄视频 | 伊人精品网 | 黄视频网站免费观看 | 综合网在线 | 深夜视频免费在线观看 | 国产美女视频黄a视频免费全过程 | 黄色特级毛片 | 九九热在线精品视频 | 天天干狠狠插 | 亚洲视频久久 | 人人做天天爱夜夜爽中字 | 日本在线看小视频网址 | 久久aa毛片免费播放嗯啊 | 好大好硬好深好爽视频h | 黄色视屏在线免费观看 | 午夜精品久久久久久99热 | 精品看片 | 97色在线 | 色视频网站人成免费 | 男女做视频网站免费观看 | 中文天堂在线最新版在线www | 免费一级毛片清高播放 | 色国产在线视频一区 | 国产哺乳期奶水avav | 天天干天天色天天射 |