吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于OpenCV如何提取中心線

新機(jī)器視覺 ? 來源:AI算法與圖像處理 ? 作者:AI算法與圖像處理 ? 2021-04-26 13:51 ? 次閱讀

問題

前幾天有個人問了我一個問題,問題是這樣的,他有如下的一張二值圖像:

怎么得到白色Blob中心線,他希望的效果如下:

顯然OpenCV中常見的輪廓分析無法獲得上面的中心紅色線段,本質(zhì)上這個問題是如何提取二值對象的骨架,提取骨架的方法在OpenCV的擴(kuò)展模塊中,另外skimage包也支持圖像的骨架提取。這里就分別基于OpenCV擴(kuò)展模塊與skimage包來完成骨架提取,得到上述圖示的中心線。

01安裝skimage與opencv擴(kuò)展包

Python環(huán)境下安裝skimage圖像處理包與opencv計算機(jī)視覺包,只需要分別執(zhí)行下面兩行命令:

pip install opencv-contrib-pythonpip install skimage

導(dǎo)入使用

from skimage import morphology import cv2 as cv

02使用skimage實現(xiàn)骨架提取

有兩個相關(guān)的函數(shù)實現(xiàn)二值圖像的骨架提取,一個是基于距離變換實現(xiàn)的medial_axis方法;另外一個是基于thin的skeletonize骨架提取方法。兩個方法的代碼實現(xiàn)分別如下:

1def skeleton_demo(image):

2 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

3 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

4 binary[binary == 255] = 1

5 skeleton0 = morphology.skeletonize(binary)

6 skeleton = skeleton0.astype(np.uint8) * 255

7 cv.imshow(“skeleton”, skeleton)

8 cv.waitKey(0)

9 cv.destroyAllWindows()

10

11

12def medial_axis_demo(image):

13 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

14 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

15 binary[binary == 255] = 1

16 skel, distance = morphology.medial_axis(binary, return_distance=True)

17 dist_on_skel = distance * skel

18 skel_img = dist_on_skel.astype(np.uint8)*255

19 contours, hireachy = cv.findContours(skel_img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

20 cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)

21

22 cv.imshow(“result”, image)

23 cv.waitKey(0)

24 cv.destroyAllWindows()

03使用OpenCV實現(xiàn)骨架提取

OpenCV的圖像細(xì)化的骨架提取方法在擴(kuò)展模塊中,因此需要直接安裝opencv-python的擴(kuò)展包。此外還可以通過形態(tài)學(xué)的膨脹與腐蝕來實現(xiàn)二值圖像的骨架提取,下面的代碼實現(xiàn)就是分別演示了基于OpenCV的兩種骨架提取方法。代碼分別如下:

1def morph_find(image):

2 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

3 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

4 kernel = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))

5 finished = False

6 size = np.size(binary)

7 skeleton = np.zeros(binary.shape, np.uint8)

8 while (not finished):

9 eroded = cv.erode(binary, kernel)

10 temp = cv.dilate(eroded, kernel)

11 temp = cv.subtract(binary, temp)

12 skeleton = cv.bitwise_or(skeleton, temp)

13 binary = eroded.copy()

14

15 zeros = size - cv.countNonZero(binary)

16 if zeros == size:

17 finished = True

18

19 contours, hireachy = cv.findContours(skeleton, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

20 cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)

21 cv.imshow(“skeleton”, image)

22 cv.waitKey(0)

23 cv.destroyAllWindows()

24

25

26def thin_demo(image):

27 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

28 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

29 thinned = cv.ximgproc.thinning(binary)

30 contours, hireachy = cv.findContours(thinned, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

31 cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)

32 cv.imshow(“thin”, image)

33 cv.waitKey(0)

34 cv.destroyAllWindows()

運行結(jié)果如下:

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像
    +關(guān)注

    關(guān)注

    2

    文章

    1089

    瀏覽量

    40572
  • 骨架
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    8408
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41556

原文標(biāo)題:基于OpenCV實戰(zhàn):提取中心線

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RK3568 + OpenCV 會碰撞出什么火花?案例詳解:2-1 基于OpenCV的畫線實驗

    一、實驗?zāi)康?本節(jié)視頻的目的是了解OpenCV的作用并通過OpenCV實現(xiàn)畫線。 二、實驗原理 OpenCV 開放源代碼計算機(jī)視覺庫 OpenCV(Open source Comput
    發(fā)表于 12-03 14:09

    【龍芯2K0300蜂鳥板試用】5 搭建opencv開發(fā)環(huán)境

    在官方提供的buildroot根文件系統(tǒng)中,不支持opencv庫,故需要自己增加,另外,在本地編譯的時候,需要在本地(ubuntu)上安裝對應(yīng)opencv庫,這樣才能將編譯好的鏡像放到板子上跑起來
    發(fā)表于 08-27 15:08

    OpenCV圖像識別C++代碼

    安裝OpenCV庫 首先,您需要在您的計算機(jī)上安裝OpenCV庫。您可以從OpenCV官網(wǎng)下載預(yù)編譯的庫或從源代碼編譯。安裝完成后,確保將OpenCV的頭文件和庫文件添加到您的項目中。
    的頭像 發(fā)表于 07-16 10:42 ?2442次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,提供了大量的圖像處理和計算機(jī)視覺相關(guān)的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?1209次閱讀

    opencv-python和opencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV
    的頭像 發(fā)表于 07-16 10:38 ?1404次閱讀

    opencv的主要功能有哪些

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機(jī)視覺庫,提供了大量的計算機(jī)視覺算法和工具。以下是OpenCV的主要功能: 圖像處理
    的頭像 發(fā)表于 07-16 10:35 ?1762次閱讀

    什么是機(jī)器視覺opencv?它有哪些優(yōu)勢?

    機(jī)器視覺(Machine Vision)是一種利用計算機(jī)和圖像處理技術(shù)來模擬人類視覺系統(tǒng)的功能,實現(xiàn)對圖像的識別、分析和理解的技術(shù)。OpenCV(Open Source Computer
    的頭像 發(fā)表于 07-16 10:33 ?901次閱讀

    基于OpenCV的人臉識別系統(tǒng)設(shè)計

    基于OpenCV的人臉識別系統(tǒng)是一個復(fù)雜但功能強大的系統(tǒng),廣泛應(yīng)用于安全監(jiān)控、人機(jī)交互、智能家居等多個領(lǐng)域。下面將詳細(xì)介紹基于OpenCV的人臉識別系統(tǒng)的基本原理、實現(xiàn)步驟,并附上具體的代碼示例。
    的頭像 發(fā)表于 07-11 15:37 ?1.5w次閱讀

    三維掃描產(chǎn)品外觀提取不規(guī)則外觀輪廓輔助貼紙設(shè)計方案

    三維掃描技術(shù)是集光學(xué)、機(jī)電和計算機(jī)技術(shù)于一體的高新無損檢測技術(shù)。CASAIM三維掃描設(shè)備,能夠?qū)嵨锏目臻g外形、結(jié)構(gòu)乃至色彩進(jìn)行全方位的掃描,將復(fù)雜的立體信息快速轉(zhuǎn)換為計算機(jī)能直接處理的數(shù)字信號。這一技術(shù)能夠精確地獲取物體表面的空間坐標(biāo),為實物提取輪廓提供了快捷、精確及
    的頭像 發(fā)表于 06-11 15:58 ?309次閱讀
    三維掃描產(chǎn)品外觀<b class='flag-5'>提取</b>不規(guī)則外觀輪廓<b class='flag-5'>線</b>輔助貼紙設(shè)計方案

    I.MX6ULL-飛凌 ElfBoard ELF1板卡 - 如何在Ubuntu中編譯OpenCV庫(X86架構(gòu))

    在之前發(fā)布的文章中探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,在調(diào)試階段,我們發(fā)現(xiàn)在 Ubuntu 環(huán)境下將 OpenCV 編譯為 X86 架構(gòu)可能更加方便和高效。 通過在主機(jī)上編譯并
    發(fā)表于 06-07 09:32

    嵌入式學(xué)習(xí)-飛凌ElfBoard ELF 1板卡 - 如何在Ubuntu中編譯OpenCV

    在之前發(fā)布的文章中探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,在調(diào)試階段,我們發(fā)現(xiàn)在 Ubuntu 環(huán)境下將 OpenCV 編譯為 X86 架構(gòu)可能更加方便和高效。 通過在主機(jī)上編譯并
    發(fā)表于 06-07 09:21

    ELF 1技術(shù)貼|如何在Ubuntu中編譯OpenCV

    在之前發(fā)布的文章中探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,在調(diào)試階段,我們發(fā)現(xiàn)在Ubuntu環(huán)境下將OpenCV編譯為X86架構(gòu)可能更加方便和高效。通過在主機(jī)上編譯并使用X86架構(gòu)
    的頭像 發(fā)表于 05-31 16:41 ?1211次閱讀
    ELF 1技術(shù)貼|如何在Ubuntu中編譯<b class='flag-5'>OpenCV</b>庫

    基于OpenCV DNN實現(xiàn)YOLOv8的模型部署與推理演示

    基于OpenCV DNN實現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?1865次閱讀
    基于<b class='flag-5'>OpenCV</b> DNN實現(xiàn)YOLOv8的模型部署與推理演示

    如何實現(xiàn)PIL和OpenCV之間圖像數(shù)據(jù)的轉(zhuǎn)換呢?

    PIL圖像數(shù)據(jù)格式轉(zhuǎn)換成OpenCV圖像數(shù)據(jù)格式
    的頭像 發(fā)表于 02-25 13:43 ?1280次閱讀

    OpenCV入門:了解與安裝指南

    OpenCV致力于高效運算和即時應(yīng)用開發(fā)。因其是用優(yōu)化的C/C++編寫的,故其可以充分利用多核處理優(yōu)勢。 并且還啟用了OpenSL,它可以利用底層異構(gòu)計算平臺的硬件加速。
    的頭像 發(fā)表于 02-21 14:26 ?651次閱讀
    <b class='flag-5'>OpenCV</b>入門:了解與安裝指南
    百家乐官网网站加盟| 银河百家乐的玩法技巧和规则| 冷水江市| 百家乐真人斗地主| 澳门百家乐官网真人娱乐场| 威尼斯人娱乐网赌| 金赞百家乐官网的玩法技巧和规则 | 百家乐官网787| 大发888怎么找不到了| 圣保罗百家乐官网的玩法技巧和规则 | 全景网百家乐的玩法技巧和规则| BB百家乐官网大转轮| 百家乐娱乐城官方网| BET365官方网| 百家乐赌场技巧大全| 百家乐官网波音平台路单| 百家乐永利娱乐网| 百家乐官网群号| 明升投注网 | 百家乐计划| 怎么玩百家乐官网的玩法技巧和规则| 国际环球娱乐| 百家乐官网博娱乐平台赌百家乐官网| 六合彩报纸| 福布斯百家乐官网的玩法技巧和规则 | 德晋百家乐的玩法技巧和规则| 星河百家乐官网的玩法技巧和规则| 怀仁县| 大发888网页免费游戏| 百家乐官网打鱼秘| 保单百家乐官网技巧| 大发888 大发娱乐城| 百家乐真钱斗地主| 皇冠网百家乐官网阿| 沙雅县| 大发888 客服| 玩百家乐输澳门百家乐现场 | 乐天堂百家乐娱乐平台| 战神百家乐官网的玩法技巧和规则| 百家乐官网注册开户送彩金| 一二博网址|