日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像连通区域标记

發布時間:2024/1/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像连通区域标记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于最近做實驗用到二值圖像連通區域(八連通)標記,剛開始的時候為了驗證算法有效性,用了遞歸的方法(太慢了,而且圖像一大就容易棧溢出),最后查看了opencv和MATLAB的實現,做個記錄。(為了簡單說明,以下說明已四連通為例)

掃描法連通區域標記:

例:對于二值圖像、四連通

第一次遍歷:

1.建立一個和圖像大小一樣的矩陣保存結果,原圖記為im,結果矩陣記為mask,mask各元素值可初始化為0. 從上到下,從左到右掃描原圖像,變量Mark記錄當前賦值

2.若當前訪問像素坐標(i,j)且im[i,j]不為0,訪問mask[i-1][j](若未越界)和mask[i,j-1](若未越界),二者若均為0,Mark++,賦值給當前坐標對應的mask. 若其中一個為0,將非0值賦值給mask[i][j]。 若均非0且相等,將mask[i][j]標記為同一類,若不等將二者最小值賦予mask[i][j],同時將二者合并為同一類(并查集)。

第二次遍歷:

根據并查集的內容對區域賦值。

?

?

def countRegion(img):[high,width] = np.shape(img)mask = np.zeros_like(img)mark = 0union = {}for i in range (high):for j in range(width):if i==0 and j==0:if img[i][j]==255:mark=mark+1mask[i][j]=markunion[mark]=markif i==0 and j!=0:if img[i][j]==255:left = mask[i][j-1]if left!=0:mask[i][j]=leftelse:mark = mark +1mask[i][j]=markunion[mark]=markif j==0 and i!=0:if img[i][j]==255:up = mask[i-1][j]up_right = mask[i-1][j+1]if up==0 and up_right==0:mark = mark+1mask[i][j]=markunion[mark]=markif up==0 and up_right!=0:mask[i][j]=up_rightif up_right==0 and up!=0:mask[i][j]=upif up!=0 and up_right!=0:if up==up_right:mask[i][j]=upelse:mi = min(up,up_right)mask[i][j]=miif up<up_right:union[up_right]=upelse:union[up]=up_rightif i!=0 and j!=0:if img[i][j]==255:up = mask[i-1][j]up_left = mask[i-1][j-1]left = mask[i][j-1]up_right = 0if j+1<width:up_right = mask[i-1][j+1]ma = max(max(max(up,up_left),up_right),left)if ma==0:mark = mark+1mask[i][j]=markunion[mark]=markelse:if up==up_right and up_right==up_left and up==left:mask[i][j]=upelse:mi = min(min(min(up, up_left), up_right), left)if mi!=0:mask[i][j]=miif up!=mi:union[up]=miif up_right!=mi:union[up_right]=miif up_left!=mi:union[up_left]=miif left!=mi:union[left]=mielse:n_zero = []if up!=0:n_zero.append(up)if up_left!=0:n_zero.append(up_left)if up_right!=0:n_zero.append(up_right)if left!=0:n_zero.append(left)mi1 = min(n_zero)mask[i][j]=mi1for it in n_zero:if it!=mi1:union[it]=mi1for i in range(high):for j in range(width):key = mask[i][j]if key!=0:while union[key]!=key:key = union[key]mask[i][j]=keyreturn mask

八鄰域連通區域標記Python實現

參考:MATLAB,opencv連通區域標記算法

總結

以上是生活随笔為你收集整理的图像连通区域标记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。