最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中連通域分割Two-Pass算法的原理與實(shí)現(xiàn)詳解

 更新時(shí)間:2023年12月25日 11:49:34   作者:微小冷  
兩遍掃描法(?Two-Pass?),正如其名,指的就是通過掃描兩遍圖像,將圖像中存在的所有連通域找出并標(biāo)記,本文將詳細(xì)介紹Two-Pass算法的原理與實(shí)現(xiàn),需要的可以參考下

連通域Two-Pass算法

在沒有任何先驗(yàn)知識的情況下,想完成連通域的搜索,幾乎最直接的想法,就是遍歷圖像所有像素點(diǎn),如果兩個(gè)像素點(diǎn)相連接,便將二者視為一體,直到遍歷所有的像素。但這種遍歷在遇到類似下面的圖像時(shí)就會(huì)出現(xiàn)問題。

上面的矩陣中,數(shù)字代表有效像素,如果掃描順序是從左向右,從上到下,那么在掃描第二行時(shí),2并不和1聯(lián)通,3盡管和1,2均聯(lián)通,但只能賦予1個(gè)編號,從而上面的情況最終標(biāo)記如下

所以,原本屬于一個(gè)連通域的3個(gè)像素點(diǎn),被分為1,3和2兩個(gè)區(qū)域,所以需要再去遍歷一次,把相鄰的不同編號統(tǒng)一,這就是Two-Pass算法的基本思想。

數(shù)據(jù)準(zhǔn)備

在具體實(shí)現(xiàn)算法之前,先準(zhǔn)備一張二值圖像,并封裝一個(gè)繪圖函數(shù)。

import matplotlib.pyplot as plt
from scipy.ndimage import binary_erosion
import numpy as np
path = r"coin.png"
img = plt.imread(path).astype(float)
img = np.mean(img, axis=2)
th = 0.513    # climb(img, 0.1, 0, 0.01)
b = img>0.4

def drawImg(im1, im2, c1='jet', c2='jet'):
    fig = plt.figure()
    ax = fig.add_subplot(121)
    plt.imshow(im1, cmap=c1)
    plt.axis('off')
    ax = fig.add_subplot(122)
    plt.imshow(im2, cmap=c2)
    plt.axis('off')
    plt.show()

b = img>0.4
bb = binary_erosion(b, np.ones([5,5]))

第一次

第一次掃描的目的是建立當(dāng)前像素與左邊和上邊的像素之間的聯(lián)通關(guān)系,同時(shí)需要一個(gè)字典保存這種映射,為后續(xù)的連通域合并做準(zhǔn)備。

def firstPass(inImg):
    L = 0       # 標(biāo)記號
    outImg = inImg.astype(float)
    h, w = inImg.shape
    dct = {}
    for i,j in product(range(h), range(w)):
        if inImg[i,j] == 0:
            continue
        neighbors = []   # 記錄符合要求的鄰域前景
        if i-1> 0 and inImg[i-1, j]>0:
            neighbors.append(outImg[i-1, j])
        if j-1 > 0 and inImg[i, j-1] > 0:
            neighbors.append(outImg[i, j-1])
        if len(neighbors) == 0:
            L += 1
            outImg[i,j] = L
            dct[L] = [[i],[j]]
        else:
            tmpL = min(neighbors)
            outImg[i,j] = tmpL
            dct[tmpL][0].append(i)
            dct[tmpL][1].append(j)
    return outImg, dct

實(shí)驗(yàn)效果如下

c1, d = firtPass(bb)
drawImg(bb, c1)

第二次

第二次掃描的目的是,將屬于同一連通域,但編號不同的區(qū)域,賦予相同的序號。為此 ,需要再次遍歷圖像,并通過第一次遍歷得到的映射字典,來完成連通域的合并。

def secondPass(outImg, dct):
    outImg = outImg * 1
    print('version')
    for i,j in zip(*np.where(outImg!=0)):
        Ls = [outImg[i,j]]
        if i-1>0 and outImg[i-1,j] != 0:
            Ls.append(outImg[i-1,j])
        if j-1 > 0 and outImg[i, j-1] != 0:
            Ls.append(outImg[i, j-1])
        Ls = np.unique(Ls)
        if len(Ls)<2:
            continue
        minL = np.min(Ls)
        for L in Ls:
            if L == minL:
                continue
            y,x = dct[L]
            outImg[y,x] = minL
            dct[minL][0].extend(dct[L][0])
            dct[minL][1].extend(dct[L][1])
            del dct[L]
    u = np.unique(outImg)
    u = np.sort(u)  # 排序
    N = len(u) - 1  # 此為圖標(biāo)數(shù)
    for i in range(1, N+1):
        outImg[outImg==u[i]] = i
    N = len(np.unique(outImg))
    return N, outImg

效果如下

n, c2 = secondPass(c1, d)
drawImg(c1, c2)

到此這篇關(guān)于Python中連通域分割Two-Pass算法的原理與實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Python連通域分割內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • wxPython+Matplotlib繪制折線圖表

    wxPython+Matplotlib繪制折線圖表

    這篇文章主要介紹了wxPython+Matplotlib繪制折線圖表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • pyspark?dataframe列的合并與拆分實(shí)例

    pyspark?dataframe列的合并與拆分實(shí)例

    這篇文章主要介紹了pyspark?dataframe列的合并與拆分實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python將txt文件讀取為字典的示例

    python將txt文件讀取為字典的示例

    今天小編就為大家分享一篇python將txt文件讀取為字典的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python實(shí)現(xiàn)批量讀取word中表格信息的方法

    Python實(shí)現(xiàn)批量讀取word中表格信息的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)批量讀取word中表格信息的方法,可實(shí)現(xiàn)針對word文檔的讀取功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Python去除字符串兩端空格的方法

    Python去除字符串兩端空格的方法

    這篇文章主要介紹了Python去除字符串兩端空格的方法,本文主要講解了string.lstrip、string.rstrip、string.strip等函數(shù)的運(yùn)用,需要的朋友可以參考下
    2015-05-05
  • 對python中Librosa的mfcc步驟詳解

    對python中Librosa的mfcc步驟詳解

    今天小編就為大家分享一篇對python中Librosa的mfcc步驟詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • pandas DataFrame tail的使用小結(jié)

    pandas DataFrame tail的使用小結(jié)

    本文主要介紹了pandas DataFrame tail的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • Python獲取文件夾下所有文件的方法教程

    Python獲取文件夾下所有文件的方法教程

    使用Python獲取文件夾下所有文件可采用os模塊或pathlib模塊,os模塊通過os.listdir和os.walk方法實(shí)現(xiàn)文件遍歷,而pathlib模塊通過Path類和其iterdir與rglob方法實(shí)現(xiàn),兩種方法各有優(yōu)勢,可根據(jù)具體需求選擇使用,需要的朋友可以參考下
    2024-11-11
  • Python中使用第三方庫xlutils來追加寫入Excel文件示例

    Python中使用第三方庫xlutils來追加寫入Excel文件示例

    這篇文章主要介紹了Python中使用第三方庫xlutils來追加寫入Excel文件示例,本文直接給出追加寫入示例和追加效果,需要的朋友可以參考下
    2015-04-04
  • 基于Python編寫一個(gè)Excel轉(zhuǎn)XML格式轉(zhuǎn)換工具

    基于Python編寫一個(gè)Excel轉(zhuǎn)XML格式轉(zhuǎn)換工具

    在日常開發(fā)工作中,我們經(jīng)常需要處理不同格式的數(shù)據(jù)轉(zhuǎn)換,今天分享一個(gè)實(shí)用的Python腳本,它能夠?qū)xcel中的數(shù)據(jù)自動(dòng)轉(zhuǎn)換為符合特定格式要求的XML文件,這個(gè)工具特別適合處理配置文件、本地化文件、元數(shù)據(jù)轉(zhuǎn)換等場景,需要的朋友可以參考下
    2025-09-09

最新評論

南安市| 电白县| 易门县| 桐庐县| 自治县| 广灵县| 周宁县| 武城县| 新丰县| 诏安县| 达尔| 项城市| 沅陵县| 林周县| 紫金县| 厦门市| 栾城县| 阳西县| 普兰店市| 汽车| 南江县| 东海县| 沙雅县| 青冈县| 大邑县| 蓝田县| 黄大仙区| 永城市| 平定县| 南通市| 黄陵县| 新河县| 阜南县| 荆门市| 仙游县| 和硕县| 洛川县| 阿尔山市| 班玛县| 西林县| 巧家县|