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

Python實現(xiàn)連通域標記算法

 更新時間:2023年12月13日 09:04:12   作者:微小冷  
如果把圖像分為前景和背景兩部分,那么連通域就是連通在一起的前景,這種關(guān)系對于二值圖像來說比較明顯,下面我們就來了解一下連通域標記算法原理及其Python實現(xiàn)吧

問題引入

通俗地說,如果把圖像分為前景和背景兩部分,那么連通域就是連通在一起的前景,這種關(guān)系對于二值圖像來說比較明顯。

以下面的硬幣圖像,在二值化之后,可以很明顯看到,圖像被分為黑色和白色兩個部分,若以白色為背景,則黑色被白色隔開,彼此之間并不聯(lián)通。連通域標記的目的,就是為不連通的這些黑色區(qū)域,標上不同的序號。

其繪圖代碼如下,其中climb是此前實現(xiàn)的自動ostu閾值算法,參考這篇:OTSU算法及其Python實現(xiàn)

import matplotlib.pyplot as plt
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>th

def drawImg(im1, im2, c1='gray', c2='gray'):
    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()

drawImg(img, b)

實現(xiàn)

常用的連通域標記算法是Two-Pass算法,顧名思義,就是迭代兩次,第一次用于記錄相鄰像素的連通域關(guān)系,第二次則把相連通的區(qū)域置以相同的標簽。

在遍歷之前,先初始化一個編號矩陣,考慮到Python提供了字典這種數(shù)據(jù)類型,所以第一次遍歷,將關(guān)聯(lián)相鄰像素的編號。比如,點P12的編號是3,點P22的編號是4,而且二者均為目標,則將產(chǎn)生一組鍵值對{3:4}。

下面就是這個字典的創(chuàng)建過程,由于在遍歷過程中,每個像素點要和它左側(cè)和上方的像素點進行比較,所以這個字典的值應(yīng)該是一個列表。

from itertools import product
def getIndDct(img):
    # 元素個數(shù)
    m,n = img.shape
    # 編號矩陣
    indMat = np.arange(m*n).reshape([m,n])
    dct = {}
    for i,j in product(range(m), range(n)):
        if img[i,j] == 0:
            continue
        ind = indMat[i,j]
        dct[ind] = []
        if i>1 and img[i-1,j]!=0:
            dct[ind].append(indMat[i-1,j])
        if i+1<m and img[i+1, j]!=0:
            dct[ind].append(indMat[i+1,j])
        if j > 1 and img[i,j-1]!=0:
            dct[ind].append(indMat[i, j-1])
        if j+1 < n and img[i, j+1] != 0:
            dct[ind].append(indMat[i, j+1])
    return dct

在得到編號映射字典之后,需要將其歸一化,就是把類似a:[b,c]和]c:[d,e]合并為a:[b,c,d,e]。當所有編號都已經(jīng)歸類之后,還可以繼續(xù)將其變?yōu)閇a,b,c,d,e]實現(xiàn)如下

from copy import deepcopy
def mergeKey(dct, key):
    keys = [key]
    st, ed = 0, 1
    while len(keys)>0:
        for i in range(st, ed):
            k = keys[i]
            if k in dct:
                keys += dct[k]
                del dct[k]
        if ed == len(keys):
            break
        st, ed = ed, len(keys)
    return keys

def uniqueDct(dct):
    uDct = deepcopy(dct)
    for k in dct:
        if k in uDct:
            uDct[k] = list(set(mergeKey(uDct, k)))
    return [list(set([k]+v)) for k,v in uDct.items()]

最后,將其重新賦值,由于編號矩陣是按照自然數(shù)列的順序創(chuàng)建的,故而只需先把圖像展平,就可以通過編號矩陣的索引直接對圖像的某些區(qū)域重新賦值。

def cds(img):
    dct = getIndDct(img)
    lst = uniqueDct(dct)
    arr = img.reshape(-1)*0
    for i,L in enumerate(lst, 1):
        arr[L] = i
    return arr.reshape(img.shape)

測試

接下來,將這個連通域算法應(yīng)用到硬幣圖像上,由于上面的硬幣圖案有很多噪聲,會影響連通域計算結(jié)果,所以先對其進行預(yù)處理

from scipy.ndimage import binary_erosion

b = img>0.4
bb = binary_erosion(b, np.ones([5,5]))
c = cds(bb)
drawImg(img, c, 'gray', 'jet')

效果如下

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

相關(guān)文章

  • Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決

    Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決

    這篇文章主要介紹了Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python實現(xiàn)把類當做字典來訪問

    Python實現(xiàn)把類當做字典來訪問

    今天小編就為大家分享一篇Python實現(xiàn)把類當做字典來訪問,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python3中pip3安裝出錯,找不到SSL的解決方式

    python3中pip3安裝出錯,找不到SSL的解決方式

    今天小編就為大家分享一篇python3中pip3安裝出錯,找不到SSL的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python?正則表達式從入門到實戰(zhàn)(看完就能直接用在項目里)

    Python?正則表達式從入門到實戰(zhàn)(看完就能直接用在項目里)

    本文介紹了Python正則表達式的基本概念、核心模塊re及其常用方法match、search、findall,詳細講解了正則表達式基礎(chǔ)語法、分組與分組引用、貪婪與非貪婪模式、修飾符等高級特性,并提供了一些實戰(zhàn)案例,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • Django使用paginator插件實現(xiàn)翻頁功能的實例

    Django使用paginator插件實現(xiàn)翻頁功能的實例

    今天小編就為大家分享一篇關(guān)于Django使用paginator插件實現(xiàn)翻頁功能的實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 簡單介紹Python的第三方庫yaml

    簡單介紹Python的第三方庫yaml

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python的第三方庫yaml展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python中的Dunder方法實現(xiàn)小結(jié)

    Python中的Dunder方法實現(xiàn)小結(jié)

    本文主要介紹了Python中的Dunder方法實現(xiàn)小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Python如使用正則表達式匹配提取文章日期

    Python如使用正則表達式匹配提取文章日期

    在處理文本數(shù)據(jù)時,從文章中提取日期信息是一個常見需求,本文將詳細介紹如何使用正則表達式匹配各種常見日期格式,并提供可復(fù)用的代碼示例,希望對大家有所幫助
    2026-04-04
  • Python使用ConfigParser解析INI配置文件的完全指南

    Python使用ConfigParser解析INI配置文件的完全指南

    配置文件提供了一種結(jié)構(gòu)化的方式來管理應(yīng)用程序設(shè)置,比單獨使用環(huán)境變量更有組織性,INI文件采用簡單的基于部分的格式,既易于閱讀又易于解析,Python內(nèi)置的configparser模塊使處理這些文件變得簡單而強大,需要的朋友可以參考下
    2025-10-10
  • pytorch加載的cifar10數(shù)據(jù)集過程詳解

    pytorch加載的cifar10數(shù)據(jù)集過程詳解

    這篇文章主要介紹了pytorch加載的cifar10數(shù)據(jù)集,到底有沒有經(jīng)過歸一化,本文對這一問題給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11

最新評論

海城市| 板桥市| 正蓝旗| 桃江县| 漠河县| 乳源| 滦平县| 麻江县| 郁南县| 汨罗市| 广灵县| 黄冈市| 呼和浩特市| 中江县| 彰化县| 赣榆县| 高州市| 蒲城县| 雅安市| 聂拉木县| 上犹县| 许昌县| 苍溪县| 攀枝花市| 三门峡市| 广南县| 玉溪市| 鲁甸县| 金川县| 枞阳县| 长泰县| 清徐县| 日喀则市| 左云县| 互助| 克什克腾旗| 叙永县| 淮南市| 同德县| 城步| 丰台区|