影象處理中連通域指由前景相同畫素,並且相同畫素鄰接的畫素組成的域。影象處理中一般都是對二值影象(1白色,0為黑色,一般前景為0黑色)做連通域分析。連通域分析指把連通域找出來並且標記出來。
連通域標記方法:(1)兩次遍歷實現;(2)深度優先搜尋遍歷
1.第一次遍歷
如果當前元素為0則賦值乙個label,lebel從大於1開始,如果畫素的鄰接畫素的標籤有大於1的,則當前元素賦值為大於1的最小的label。記錄等價標籤。
第二次遍歷
遍歷找到等價標籤,標記等價標籤的最小值為label。
如果只求連通域的數量則只需迴圈一次就夠了,連通域數等於label-等價標籤的個數-label起始值。
如:起始標記為label = 1,等價標籤存放在列表中,list=[(2,6),(3,7)],即等價標籤個數有len(list),則連通域個數為label -1-len(list).
如果需要將連通區域標記的的話需要迴圈兩次。
2.深度遍歷標記
通過深度優先把所有連通的找出來標記完,再繼續遍歷下乙個連通區域。連通域數量為 label-1.(設定的label預設值為1,歧視標記為2,如果從1標記的話會和影象值裡的1混淆,所以為了方便起始值可以是任意大於1的數)
a = [[1, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 1, 1, 1, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1, 1, 0, 1],
[1, 1, 1, 1, 1, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 1, 1, 1, 1],
[1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
[1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1]]
a = numpy.array(a)
def dfs(nums,i,j,label):
if i >=len(nums) or j>=len(nums[0]) or i<0 or j<0:
return
if nums[i][j]<1:
nums[i][j]=label
dfs(nums,i,j+1,label)
dfs(nums,i+1,j,label)
dfs(nums,i-1,j,label)
dfs(nums,i,j-1,label)
dfs(nums,i-1,j-1,label)
label = 1
for i in range(len(a)):
for j in range(len(a[0])):
if a[i][j]<1:
label +=1
a[i][j] = label
dfs(a,i,j+1,label)
dfs(a,i+1,j,label)
print a
深度優先遍歷解決連通域求解問題 python實現
在乙個矩形網格中每乙個格仔的顏色或者為白色或者為黑色。任意或上 或下 或左 或右相鄰同為黑色的格仔組成乙個家族。家族中所有格仔的數量反映家族的大小。要求找出最大家族的家族大小 組成最大家族的格仔的數量 並統計出哪些點屬於哪一族。例如下圖中最大家族的格仔數量為 8。遍歷矩形網格,找到乙個沒有被標記的黑...
連通域標記
二值影象,顧名思義就是影象的亮度值只有兩個狀態 黑 0 和白 255 二值影象在影象分析與識別中有著舉足輕重的地位,因為其模式簡單,對畫素在空間上的關係有著極強的表現力。在實際應用中,很多影象的分析最終都轉換為二值影象的分析,比如 醫學影象分析 前景檢測 字元識別,形狀識別。二值化 數學形態學能解決...
opencv實現連通域
文章 在本文中使用影象連通域統計使用opencv中的cvfloodfill方法,但是在cvfloodfill方法中cvconnectedcomp引數無法返回具體點座標位置資訊,找了些資料 給cvseq分配空間但是還是contour內容沒有值,估計是opencv2.00版本不支援。如果想獲取點座標資訊...