OPENCV去除小連通區域,去除孔洞

2021-08-04 05:16:23 字數 2052 閱讀 6120

一、對於二值圖,0代表黑色,255代表白色。去除小連通區域與孔洞,小連通區域用8鄰域,孔洞用4鄰域。

函式名字為:void removesmallregion(mat &src, mat &dst,int arealimit, int checkmode, int neihbormode)

checkmode: 0代表去除黑區域,1代表去除白區域; neihbormode:0代表4鄰域,1代表8鄰域;  

如果去除小連通區域checkmode=1,neihbormode=1去除孔洞checkmode=0,neihbormode=0

記錄每個畫素點檢驗狀態的標籤,0代表未檢查,1代表正在檢查,2代表檢查不合格(需要反轉顏色),3代表檢查合格或不需檢查 。

1.先對整個影象掃瞄,如果是去除小連通區域,則將黑色的背景圖作為合格,畫素值標記為3,

如果是去除孔洞,則將白色的色素點作為合格,畫素值標記為3。

2.掃面整個影象,對影象進行處理。

[cpp]view plain

copy

void

removesmallregion(mat &src, mat &dst,

intarealimit, 

intcheckmode, 

intneihbormode)  

}  }  }  

else

//去除孔洞,黑色點畫素

}  }  }  

vectorneihborpos;//將鄰域壓進容器

neihborpos.push_back(point2i(-1, 0));  

neihborpos.push_back(point2i(1, 0));  

neihborpos.push_back(point2i(0, -1));  

neihborpos.push_back(point2i(0, 1));  

if(neihbormode == 1)  

else

cout <

"neighbor mode: 4鄰域."

<

intneihborcount = 4 + 4 * neihbormode;  

intcurrx = 0, curry = 0;  

//開始檢測

for(

inti = 0; i 

}  }  }  

if(growbuffer.size()>arealimit) 

//判斷結果(是否超出限定的大小),1為未超出,2為超出  

checkresult = 2;  

else

for(int

z = 0; z 

//********結束該點處的檢查**********  

}  }  

}  checkmode = 255 * (1 - checkmode);  

//開始反轉面積過小的區域  

for(

inti = 0; i 

else

if(pointlabel.at(i, j) == 3)  

}  }  cout <

<

}  

呼叫函式:dst是原來的二值圖。

和之前的影象相比

matlab去除大面積連通區域

在利用進行影象形態學處理的時候,經常需要去除面積較大或面積較小的連通區域。對於去除面積較小的連通區域,matlab提供了現有的函式 bw2 bwareaopen bw,p,conn 刪除二值影象bw中面積小於p的物件,預設情況下conn使用8鄰域可是matlab並沒有去除面積較大連通區域的函式,當然...

opencv學習 去除干擾線

操作步驟 1.讀取彩色影象,imread 2.轉換為灰度影象,cvtcolor src,dst,cv bgr2gray 3.轉換為二值影象,adaptivethreshold 4,定義結構元素,getstructuringelement 5,形態學操作 如下 include includeusing...

PS小實驗 去除水印

ps小實驗 去除水印 個人覺得用photoshop是最好的去水印工具,如果是單色背景,直接用橡皮擦工具就可以完成去除水印的工作,但有時背景色並不是那麼純,而是方向性對稱,比如這張 強烈推薦ps的塗抹工具!它的靈感來自於油畫 未乾的油畫可以用手指塗抹來覆蓋顏色。所以在這張圖中可以從每個水品方向上塗抹,...