国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv 十六 python下各種連通域處理方法(按面積閾值篩選連通域、按面積排序篩選連通域、連通域分割等方法)

這篇具有很好參考價值的文章主要介紹了opencv 十六 python下各種連通域處理方法(按面積閾值篩選連通域、按面積排序篩選連通域、連通域分割等方法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本博文基于python-opencv實現(xiàn)了按照面積閾值篩選連通域、按照面積排序篩選topK連通域、 連通域細(xì)化(連通域骨架提取)、連通域分割(基于分水嶺算法使連通域在細(xì)小處斷開)、按照面積排序賽選topK輪廓等常見的連通域處理代碼。并將代碼封裝為shapeUtils類,在自己的python代碼中import shapeUtil后即可使用相應(yīng)的連通域處理方法。

1、背景知識

1.1 輪廓

輪廓(Contour )由連續(xù)的點組成,以線條的形式聚集在一起,通常是一個有x,y組成的點集,形式為N x 2(N表示輪廓中有n個點)。其是空心的,通常所統(tǒng)計的輪廓面積是那一圈線所包含的面積。在opencv中使用cv2.findContours來查找輪廓,使用cv2.contourArea來統(tǒng)計輪廓包含的面積,使用cv2.drawContours繪制輪廓。如下圖就包含了2個輪廓
opencv python 提取單連通區(qū)域,opencv實戰(zhàn),opencv,python,人工智能

1.2 連通域

連通域(Connection)由在空間上連續(xù)(相鄰)的像素點組成,是一個圖形區(qū)域。相鄰的標(biāo)準(zhǔn)有4連通域和8連通域,具體可以參考https://zhuanlan.zhihu.com/p/394073982。對二值圖統(tǒng)計完連通域后,得到一個labels圖,具體如下右圖所示,其背景區(qū)域被標(biāo)記為0,每個聯(lián)通域的值都從原來的255更改為連通域序號。下圖是按照8連通域的方式進(jìn)行統(tǒng)計的,如果按照4連通域進(jìn)行統(tǒng)計,那么標(biāo)記為2的連通域就會被斷開為兩個(總共會有5個連通域,標(biāo)簽從1~5)。
opencv python 提取單連通區(qū)域,opencv實戰(zhàn),opencv,python,人工智能

1.3 連通域與輪廓的轉(zhuǎn)換

連通域信息與輪廓存在本質(zhì)的區(qū)別,聯(lián)通域是一個形狀(Mat),輪廓是一個閉合的線條點集(list,元素為坐標(biāo))。我們可以使用cv2.drawContours將輪廓繪制為連通域,也可以使用cv2.findContours統(tǒng)計連通域的輪廓信息。在某些情況下,一個輪廓就可以對應(yīng)一個連通域;當(dāng)連通域中存在孔洞的時候,則需要多個輪廓才能表示一個連通域。
具體如下圖所示,當(dāng)連通域沒有孔洞時,可以轉(zhuǎn)換為一個輪廓;當(dāng)前存在一個孔洞時,則需要轉(zhuǎn)換2個輪廓。
opencv python 提取單連通區(qū)域,opencv實戰(zhàn),opencv,python,人工智能

2、連通域處理方法

2.1 按照面積閾值篩選連通域

通過cv2.connectedComponentsWithStats函數(shù)統(tǒng)計出聯(lián)通域的信息,labels為連通域標(biāo)記圖(具體參考1.2中的描述),stats為聯(lián)通域統(tǒng)計信息(可見代碼中的注釋,其包含連通域的xywhs信息),通過對聯(lián)通域統(tǒng)計信息stats的判斷(將連通域面積與閾值threshold進(jìn)行比較),修改連通域標(biāo)記圖labels將小于閾值的連通域標(biāo)簽值修改為0)。最后通過二值化方法,將聯(lián)通域標(biāo)記圖轉(zhuǎn)換為二值圖。

import cv2
import numpy as np 
class shapeUtils:   
	def find_big_areo(img,threshold=1000):
        #https://blog.csdn.net/weixin_44599604/article/details/111687531
        retval, labels, stats, centroids = cv2.connectedComponentsWithStats(img, connectivity=8)
        #stats的格式為二維數(shù)組,其中每一個元素為 x,y,w,h,s的格式,s為聯(lián)通域面積
        '''
        stats      #我們看出有3個連通區(qū)域
                   # x   y   w   h  s 
        >>> array([[ 0,  0, 10, 10, 76],  # 這代表整個圖片,0值也有連通區(qū)域
                   [ 4,  1,  5,  6, 18],  # 這里18代表有18個像素 下面的6同理
                   [ 2,  2,  3,  2,  6]], dtype=int32)
        '''
        for i in range(1,stats.shape[0]):
            conj=i#獲取聯(lián)通域的標(biāo)記值
            areo=stats[i,4]
            if areo<threshold:
                labels[labels==conj]=0
        labels=labels.astype(np.uint8)
        ret,labels=cv2.threshold(labels,1,255,cv2.THRESH_BINARY)
        return labels
img=cv2.imread("res.png",0)
ret,img=cv2.threshold(img,64,255,cv2.THRESH_BINARY)
im2=shapeUtils.find_big_areo(img,5000)
cv2.imshow("img",img)
cv2.imshow("labels",im2)
cv2.waitKey()

opencv python 提取單連通區(qū)域,opencv實戰(zhàn),opencv,python,人工智能

2.2 按照面積排序篩選topK連通域

按照面積排序篩選topK連通域。先使用connectedComponentsWithStats統(tǒng)計出labels和stats,然后創(chuàng)建一個行號(其實就是labels中連通域的標(biāo)簽值),并使其與stats的shape相同并將其與stats拼接在一起(在原始的stats中,第i個信息對應(yīng)著標(biāo)簽值為i的聯(lián)通域,對stats按面積排序后則會無法正常對應(yīng),故需要進(jìn)行拼接),然后使用np.argsort對stats進(jìn)行排序,在根據(jù)排序結(jié)果將topk個連通域后的標(biāo)簽值全部修改為0(將topk后的連通域刪除),最后通過二值化方法,將聯(lián)通域標(biāo)記圖轉(zhuǎn)換為二值圖。文章來源地址http://www.zghlxwxcb.cn/news/detail-765591.html


import cv2
import numpy as np 
class shapeUtils:   
        def find_topK_areo(img,k=1):
        #https://blog.csdn.net/weixin_44599604/article/details/111687531
        retval, labels, stats, centroids = cv2.connectedComponentsWithStats(img, connectivity=8)
        #stats的格式為二維數(shù)組,其中每一個元素為 x,y,w,h,s的格式,s為聯(lián)通域面積
        '''
        stats      #我們看出有3個連通區(qū)域
                   # x   y   w   h  s 
        >>> array([[ 0,  0, 10, 10, 76],  # 這代表整個圖片,0值也有連通區(qū)域
                   [ 4,  1,  5,  6, 18],  # 這里18代表有18個像素 下面的6同理
                   [ 2,  2,  3,  2,  6]], dtype=int32)
        '''
        #創(chuàng)建一個行號,并使其與stats的shape相同
        rows_num=[x for x in range(stats.shape[0])]
        rows_num=np.array(rows_num)#shape (3)
        rows_num=rows_num.reshape((-1,1)) #shape (3,1)

        print(rows_num.shape,stats.shape)
        #數(shù)據(jù)維度變化:(3, 1) (3, 5)=>(3, 6)
        stats=np.concatenate((rows_num,stats),axis=1)#拼接時要僅有一個維度不同,才能拼接
        #此時的stats的格式為二維數(shù)組,其中每一個元素為 x,y,w,h,s的格式,s為聯(lián)通域面積
        '''
        拼接后的 stats 如下所示
                  #row x   y   w   h  s 
        >>> array([[0, 0,  0, 10, 10, 76],  # 這代表整個圖片,0值也有連通區(qū)域
                   [1, 4,  1,  5,  6, 18],  # 這里18代表有18個像素 下面的6同理
                   [2, 2,  2,  3,  2,  6]], dtype=int32)
        '''

        #安裝面積對連通域進(jìn)行排序
        sortId=np.argsort(stats[:,-1])#生成一個排序好的下標(biāo),從小到大排序
        sortId=sortId[::-1]#對下標(biāo)進(jìn)行逆序,使其變?yōu)閺拇蟮叫〉呐判?/span>
        stats=stats[sortId]#根據(jù)序號重新取數(shù)據(jù)
        #stats=stats[np.argsort(stats[:,-1])[::-1] ]
        print(stats)

        #將第k面積個后的連通域label設(shè)置為0
        for i in range(k+1,stats.shape[0]):
            conj=stats[i][0]#獲取聯(lián)通域的標(biāo)記值
            labels[labels==conj]=0
        print(labels

到了這里,關(guān)于opencv 十六 python下各種連通域處理方法(按面積閾值篩選連通域、按面積排序篩選連通域、連通域分割等方法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [C++]使用OpenCV去除面積較小的連通域

    [C++]使用OpenCV去除面積較小的連通域

    這是后期補(bǔ)充的部分,和前期的代碼不太一樣 效果圖 源代碼 前期做的,方法可能不太一樣 一,先看效果圖 原圖 處理前后圖 ? 二,實現(xiàn)源代碼 ? ? ?

    2024年04月10日
    瀏覽(27)
  • Opencv+Python筆記(五)圖像閾值化處理

    Opencv+Python筆記(五)圖像閾值化處理

    圖像閾值化可以理解為一個簡單的圖像分割操作,閾值又稱為臨界值,它的目的是確定出一個范圍,然后這個范圍內(nèi)的像素點使用同一種方法處理,而閾值之外的部分則使用另一種處理方法或保持原樣。 閾值處理有2種方式,一種是固定閾值方式,又包括多種處理模式,另一

    2023年04月26日
    瀏覽(36)
  • OpenCV閾值處理(threshold函數(shù)、自適應(yīng)閾值處理、Otsu處理)

    OpenCV閾值處理(threshold函數(shù)、自適應(yīng)閾值處理、Otsu處理)

    目錄 閾值處理 一.threshold函數(shù) 1.二值化閾值處理(cv2.THRESH_BINARY) 2.反二值化閾值處理( cv2.THRESH_BINARY_INV) 3.截斷閾值化處理(cv2.THRESH_TRUNC) 4.超閾值零處理(cv2.THRESH_TOZERO_INV) 5.低閾值零處理(cv2.THRESH_TOZERO) ?二.自適應(yīng)閾值處理 ?三.Otsu處理 閾值處理是指剔除圖像內(nèi)像素

    2024年02月12日
    瀏覽(23)
  • 入門OpenCV:圖像閾值處理

    入門OpenCV:圖像閾值處理

    圖像閾值是一種簡單、高效的圖像分割方法,目的是將圖像轉(zhuǎn)換成二值圖像。這個過程涉及比較像素值和閾值,根據(jù)比較結(jié)果來確定每個像素點的狀態(tài)(前景或背景)。圖像閾值在處理二維碼、文本識別、物體跟蹤等領(lǐng)域中非常有用。本博客旨在簡介OpenCV中的閾值處理方法,

    2024年02月19日
    瀏覽(25)
  • OpenCV自學(xué)筆記九:閾值處理

    1. 閾值處理(Thresholding):閾值處理是一種圖像分割的方法,它根據(jù)像素灰度值與設(shè)定的閾值進(jìn)行比較,將像素分為兩個類別(例如黑白、前景背景等)。閾值處理可以用于目標(biāo)檢測、圖像增強(qiáng)等應(yīng)用。在OpenCV中,常用的閾值處理函數(shù)是`cv2.threshold()`。 2. threshold函數(shù):`cv2.t

    2024年02月08日
    瀏覽(23)
  • OpenCV 入門教程:全局閾值處理

    全局閾值處理是圖像處理中常用的技術(shù)之一,用于將圖像轉(zhuǎn)換為二值圖像,從而提取感興趣的目標(biāo)區(qū)域。在 OpenCV 中,全局閾值處理可以通過簡單的像素比較來實現(xiàn)。本文將以全局閾值處理為中心,為你介紹使用 OpenCV 進(jìn)行二值圖像處理的基本步驟和實例。 ???? ?? ??

    2024年02月13日
    瀏覽(22)
  • opencv(三)邊界填充、圖像融合、圖像閾值處理

    opencv(三)邊界填充、圖像融合、圖像閾值處理

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 邊界填充就是將圖片按一定的方法將圖片的四周向外填充并將圖片放大 因為opencv中的顏色通道不是RGB而是BGR,所以我們要用到之前講到的分割將顏色通道重新整合成RGB后再用matplotlib庫將其畫出 BORDER_R

    2024年02月21日
    瀏覽(30)
  • opencv-27 閾值處理 cv2.threshold()

    opencv-27 閾值處理 cv2.threshold()

    閾值處理(Thresholding)是一種常用的圖像處理技術(shù),在機(jī)器學(xué)習(xí)和計算機(jī)視覺中經(jīng)常被用于二值化圖像或二分類任務(wù)。它基于設(shè)定一個閾值來將像素值進(jìn)行分類,將像素值大于或小于閾值的部分分為兩個不同的類別,從而得到二值化的圖像或進(jìn)行二分類預(yù)測。 在圖像處理中的

    2024年02月15日
    瀏覽(23)
  • 第五章 Opencv圖像處理框架實戰(zhàn) 5-3 圖像閾值與平滑處理

    第五章 Opencv圖像處理框架實戰(zhàn) 5-3 圖像閾值與平滑處理

    ret, dst = cv2.threshold(src, thresh, maxval, type) src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖 dst: 輸出圖 thresh: 閾值 maxval: 當(dāng)像素值超過了閾值(或者小于閾值,根據(jù)type來決定),所賦予的值 type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY

    2024年02月14日
    瀏覽(26)
  • opencv-28 自適應(yīng)閾值處理-cv2.adaptiveThreshold()

    opencv-28 自適應(yīng)閾值處理-cv2.adaptiveThreshold()

    對于色彩均衡的圖像,直接使用一個閾值就能完成對圖像的閾值化處理。但是,有時圖像的色彩是不均衡的,此時如果只使用一個閾值,就無法得到清晰有效的閾值分割結(jié)果圖像。 有一種改進(jìn)的閾值處理技術(shù),其使用變化的閾值完成對圖像的閾值處理,這種技術(shù)被稱為自適應(yīng)

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包