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

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

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

OpenCV4筆記之連通域分析

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2023-12-25 17:16 ? 次閱讀

Part11. 圖像的連通域以及連通域分析

在該系列第六篇文章中,曾經(jīng)介紹過連通的概念,下面再來回顧一下。

連通:若 S 是圖像中的一個(gè)像素子集,對于任意的 。如果存在一條由 S 中像素組成的從 p 到 q 的通路,則稱 p 在像素集 S 中與 q 連通

連通域是指具有相同屬性的連通集合。例如,在一個(gè)二值圖像中,具有相同像素值的區(qū)域構(gòu)成一個(gè)連通域。

所以,連通連通域是兩個(gè)不同的概念,連通域連通的子集。連通域具有以下特性:

一個(gè)連通域中的所有像素都具有相同的性質(zhì)。

一個(gè)連通域中的任意兩個(gè)像素都可以通過連續(xù)的路徑連接起來。

一個(gè)連通域可以是單連通的,也可以是多連通的。

連通域分析是指在圖像中查找標(biāo)記連通域的算法。這是一種常用的圖像處理技術(shù),可以用于目標(biāo)檢測、圖像分割和形狀識別等等。本文是基于二值圖像進(jìn)行連通域的分析。

Part22. 連通域分析的算法

連通域分析的算法可以分為以下幾類:

基于標(biāo)記的算法:該類算法首先將每個(gè)像素分配一個(gè)唯一的標(biāo)記,然后使用某種策略將具有相同標(biāo)記的像素連接起來?;跇?biāo)記的算法包括兩遍掃描法、種子填充法和快速連通域查找法。

基于鄰域查找的算法:該類算法從圖像中的一個(gè)起始像素開始,逐個(gè)檢查其鄰域像素,如果鄰域像素具有相同像素值,則將其加入到當(dāng)前連通域中。基于鄰域查找的算法包括深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)。

基于分割的算法:該類算法將圖像分割成多個(gè)區(qū)域,每個(gè)區(qū)域都具有相同的像素值?;诜指畹乃惴ò▓D論方法和區(qū)域生長法。

其中,基于標(biāo)記的算法是比較常用的連通域分析的算法。

12.1 兩遍掃描法

兩遍掃描算法的步驟如下

第一遍掃描

從左到右,從上到下遍歷圖像。

將每個(gè)有效像素賦予一個(gè)唯一的標(biāo)記。

第二遍掃描

再次從左到右,從上到下遍歷圖像。

檢查兩個(gè)相鄰像素是否具有相同的標(biāo)記。

如果兩個(gè)相鄰像素具有相同的標(biāo)記,則將它們連接起來。

6852f152-a304-11ee-8b88-92fbcf53809c.giftwo-pass.gif

22.2 種子填充法

種子填充算法的步驟如下:

初始化:將圖像中的所有像素標(biāo)記為未訪問。

選擇一個(gè)起始像素作為種子。

將種子像素標(biāo)記為已訪問。

檢查種子像素的鄰域像素。

如果鄰域像素具有相同的像素值,則將其標(biāo)記為已訪問。

如果鄰域像素具有不同的像素值,則忽略。

重復(fù)步驟 4,直到圖像中的所有像素都被標(biāo)記為已訪問或直到?jīng)]有未訪問的鄰域像素為止。

68707b8c-a304-11ee-8b88-92fbcf53809c.gifseed-filling.gif

Part33. OpenCV 自帶的連通域函數(shù)

OpenCV 提供了兩個(gè)函數(shù):connectedComponents()、connectedComponentsWithStats() 在二值圖像中查找連通域。

下面的例子,在圖中找到連通域并標(biāo)記不同的顏色。

#include
#include
#include"opencv2/imgproc.hpp"
#include"opencv2/highgui.hpp"

usingnamespacestd;
usingnamespacecv;

voidlabelColor(Mat&labelImg,Mat&dst)
{
mapcolors;

intwidth=labelImg.cols;
intheight=labelImg.rows;

dst=Mat::zeros(labelImg.size(),CV_8UC3);

ucharr=255*(rand()/(1.0+RAND_MAX));
ucharg=255*(rand()/(1.0+RAND_MAX));
ucharb=255*(rand()/(1.0+RAND_MAX));

for(inti=0;i(i);
uchar*data_dst=dst.ptr(i);

for(intj=0;j=1)
{
if(colors.count(pixelValue)==0)
{
colors[pixelValue]=Scalar(b,g,r);
r=255*(rand()/(1.0+RAND_MAX));
g=255*(rand()/(1.0+RAND_MAX));
b=255*(rand()/(1.0+RAND_MAX));
}

Scalarcolor=colors[pixelValue];
*data_dst++=color[0];
*data_dst++=color[1];
*data_dst++=color[2];
}
else
{
data_dst++;
data_dst++;
data_dst++;
}
}
}
}

intmain(intargc,char**argv){
Matsrc=imread(".../coins.jpg");
imshow("src",src);

Matgray,thresh;
cvtColor(src,gray,cv::COLOR_BGR2GRAY);//灰度化
imshow("gray",gray);

Matgauss;
GaussianBlur(gray,gauss,Size(15,15),0);//降噪

threshold(gauss,thresh,0,255,THRESH_BINARY|THRESH_OTSU);
imshow("thresh",thresh);

Matlabels,stats,centroids;
intnum_labels=connectedComponents(thresh,labels,8,CV_32S);
cout<
原圖和灰度化.png 二值化和標(biāo)記連通域.png
intconnectedComponents(InputArrayimage,OutputArraylabels,intconnectivity,intltype,intccltype);

其各個(gè)參數(shù)的含義:

第一個(gè)參數(shù) image:輸入圖像必須是二值圖像1。第二個(gè)參數(shù) labels:輸出圖像,其中每個(gè)像素值表示其所在連通域的標(biāo)簽。標(biāo)簽的值從 0 開始,依次遞增。第三個(gè)參數(shù) connectivity:標(biāo)記連通域時(shí)使用的鄰域種類。可選的是 4、8,默認(rèn)值是 8。第四個(gè)參數(shù) ltype:輸出標(biāo)簽的類型??梢栽O(shè)置為 CV_32S 或 CV_16U,默認(rèn)值是 CV_32S 。第五個(gè)參數(shù) ccltype:標(biāo)記連通域分析算法的類型。

參數(shù)類型 作用
CCL_WU 0 8 鄰域和 4 鄰域均用 SAUF 算法。
CCL_DEFAULT -1 8 鄰域用 BBDT 算法,4 鄰域用 SAUF 算法。
CCL_GRANA 1 8 鄰域用 BBDT 算法,4 鄰域用 SAUF 算法。

connectedComponentsWithStats() 函數(shù)除了返回每個(gè)連通域的標(biāo)簽之外,還返回每個(gè)連通域的其他信息,包括:

面積

外接矩形

中心坐標(biāo)

intmain(intargc,char**argv){
Matsrc=imread(".../coins.jpg");
imshow("src",src);

Matgray,thresh;
cvtColor(src,gray,cv::COLOR_BGR2GRAY);//灰度化
imshow("gray",gray);

Matgauss;
GaussianBlur(gray,gauss,Size(15,15),0);//降噪

threshold(gauss,thresh,0,255,THRESH_BINARY|THRESH_OTSU);
imshow("thresh",thresh);

Matlabels,stats,centroids;
intnum_labels=connectedComponentsWithStats(thresh,labels,stats,centroids);
cout<(i,CC_STAT_AREA);
intleft=stats.at(i,CC_STAT_LEFT);
inttop=stats.at(i,CC_STAT_TOP);
intwidth=stats.at(i,CC_STAT_WIDTH);
intheight=stats.at(i,CC_STAT_HEIGHT);
intcx=centroids.at(i,0);
intcy=centroids.at(i,1);

cout<

執(zhí)行結(jié)果:

num_labels=8
Object1:Area=17061,Left=344,Top=160,Width=144,Height=151,Centroid=(415,234)
Object2:Area=9655,Left=592,Top=411,Width=108,Height=114,Centroid=(645,467)
Object3:Area=9558,Left=776,Top=441,Width=108,Height=113,Centroid=(828,497)
Object4:Area=17874,Left=435,Top=517,Width=150,Height=152,Centroid=(509,592)
Object5:Area=17502,Left=660,Top=648,Width=148,Height=151,Centroid=(733,723)
Object6:Area=10420,Left=726,Top=864,Width=114,Height=117,Centroid=(782,922)
Object7:Area=15634,Left=628,Top=1075,Width=141,Height=143,Centroid=(698,1146)

Part44. 總結(jié)

連通域分析是圖像處理中常用的算法之一,用于在二值圖像中找到具有相同像素值且相互連接的區(qū)域。它在圖像處理中具有廣泛的應(yīng)用場景。

審核編輯:湯梓紅

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

    關(guān)注

    23

    文章

    4580

    瀏覽量

    92361
  • 圖像
    +關(guān)注

    關(guān)注

    2

    文章

    1078

    瀏覽量

    40355
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4263

    瀏覽量

    62244
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    623

    瀏覽量

    41184

原文標(biāo)題:OpenCV4筆記 之 連通域分析

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

收藏 人收藏

    評論

    相關(guān)推薦

    ACER 370筆記本電腦主板電路圖

    本帖最后由 gk320830 于 2015-3-9 03:41 編輯 ACER 370筆記本電腦主板電路圖
    發(fā)表于 08-16 20:45

    愛鼓搗stm32筆記

    愛鼓搗stm32筆記1-4
    發(fā)表于 06-16 17:37

    STM32筆記 EXIT(外部中斷)精選資料分享

    /O映像三、中斷服務(wù)四、配置流程(代碼解析)五、中斷函數(shù)處理在上一篇STM32筆記 GPIO引腳中,有用到 EXIT外部中斷作為 Key輸入觸發(fā),所以本篇來...
    發(fā)表于 08-05 06:10

    東芝SATELLITE 1410/2410筆記本電腦用戶手冊

    東芝SATELLITE 1410/2410筆記本電腦用戶手冊
    發(fā)表于 07-28 22:59 ?23次下載

    華碩ASUS F7KR R2.0.0筆記本原理圖

    華碩ASUS F7KR R2.0.0筆記本原理圖:
    發(fā)表于 03-02 16:15 ?799次下載
    華碩ASUS F7KR R2.0.0<b class='flag-5'>筆記</b>本原理圖

    簡易AD13筆記

    個(gè)人資料心得,一點(diǎn)一點(diǎn),不多,請見諒!13筆記,有點(diǎn)用
    發(fā)表于 11-17 11:43 ?9次下載

    STM32各模塊學(xué)習(xí)筆記

    ..........................................................4 STM32筆記四 STM32中定時(shí)器的時(shí)鐘源............................15
    發(fā)表于 11-30 03:32 ?3120次閱讀

    聯(lián)想電腦維修實(shí)際案例--G470筆記本電路分析

    聯(lián)想電腦維修實(shí)際案例--G470筆記本電路分析
    發(fā)表于 02-03 10:45 ?332次下載

    惠普G4-2000筆記本的電路原理圖合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是惠普1000 G4-2000 CQ35-701TU CQ45筆記本的電路原理圖合集。
    發(fā)表于 10-29 08:00 ?15次下載
    惠普G<b class='flag-5'>4</b>-2000<b class='flag-5'>筆記</b>本的電路原理圖合集

    基于opencv4和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)

    效果視頻 基于opencv4和yolo,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)
    發(fā)表于 11-23 17:36 ?16次下載
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)

    [筆記]|[stm32]|[寄存器存儲器區(qū)別]|[PWM]|[串口]|[Timer]stm32f103筆記

    [筆記]|[stm32]|[寄存器存儲器區(qū)別]|[PWM]|[串口]|[Timer]stm32f103筆記筆記為18.12.21者期末復(fù)習(xí)所寫 ——僅作為自己期末復(fù)習(xí)以及過后查閱
    發(fā)表于 12-06 18:51 ?10次下載
    [<b class='flag-5'>筆記</b>]|[stm32]|[寄存器存儲器區(qū)別]|[PWM]|[串口]|[Timer]stm32f103<b class='flag-5'>筆記</b>

    dell 7559筆記本電路圖方框圖免費(fèi)下載

    dell 7559筆記本電路圖方框圖免費(fèi)下載。
    發(fā)表于 03-28 15:46 ?40次下載

    如何在Raspberry Pi 3上安裝OpenCV4

    今天我們將學(xué)習(xí)如何在 Raspberry Pi 3 上安裝 OpenCV4 庫,以便我們可以將其用于計(jì)算機(jī)視覺應(yīng)用程序。這將允許 OpenCV 在像 Pi 這樣的便攜式設(shè)備上運(yùn)行,從而打開許多可能性的大門。所以讓我們開始吧
    的頭像 發(fā)表于 09-08 16:09 ?1553次閱讀
    如何在Raspberry Pi 3上安裝<b class='flag-5'>OpenCV4</b>庫

    OpenCV4源碼分析

    宏定義必須寫在函數(shù)之外,其作用是 #define 開始,到源程序結(jié)束。如果要提前結(jié)束它的作用則用 #undef 命令
    的頭像 發(fā)表于 02-22 10:00 ?885次閱讀
    <b class='flag-5'>OpenCV4</b>源碼<b class='flag-5'>分析</b>

    學(xué)習(xí)OpenCV4的系統(tǒng)化路線圖

    OpenCV4發(fā)布測試版本開始,作者就一直關(guān)注!根據(jù)自己近十年圖像處理OpenCV開發(fā)相關(guān)工作經(jīng)驗(yàn),花了七個(gè)月的時(shí)間,針對OpenCV4、精心選擇OpenCV中常用模塊與知識點(diǎn),構(gòu)建
    的頭像 發(fā)表于 07-05 11:30 ?563次閱讀
    學(xué)習(xí)<b class='flag-5'>OpenCV4</b>的系統(tǒng)化路線圖