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

深入解析opencv骨架提取的算法步驟

 更新時間:2022年05月06日 09:24:23   作者:追天一方  
這篇文章主要介紹了深入解析opencv骨架提取的算法步驟

前言

個人感覺骨架提取提取的就是開運算過程的不可逆。

一.算法步驟

1.算法步驟

首先上一下比較官方的算法步驟:

1.獲得原圖像的首地址及圖像的寬和高,并設置循環(huán)標志1

2.用結(jié)構(gòu)元素腐蝕原圖像,并保存腐蝕結(jié)果

3.設置循環(huán)標志為0,如果腐蝕結(jié)果中有一個點為255,即原圖像尚未被完全腐蝕成空集,則將循環(huán)標志設為1.

4.用結(jié)構(gòu)元素對腐蝕后的圖像進行開運算(消除小的白色區(qū)域),并求取腐蝕運算與開運算的差(得到消除的白色區(qū)域)

5.用[4]中求得的結(jié)果與之前求得的骨架進行并集運算,以獲得本次循環(huán)求得的骨架
6.把本次循環(huán)中保存的腐蝕結(jié)果賦值給原圖像

7.重復步驟[2]-[6],直到將原圖像腐蝕成空集為止。

最終求得的骨架就是結(jié)果。

2.分析

作者的理解是這樣的:

輸入:img(二值圖)
輸出:out(和img一樣shape的圖像,初始化是全0)
while img中有像素值為255(在這個循環(huán)里面,一直腐蝕我們的二值圖,直到全部為黑色):
    腐蝕img圖像
    對img開運算
	img2=開運算前的圖像減去開運算后的圖像
	out+=img2
輸出out

首先說一下開運算,就是對圖像先做腐蝕再做膨脹。上面一個核心點就是這一步(img2=開運算前的圖像減去開運算后的圖像),在這里為什么說個人感覺骨架提取提取的就是開運算過程的不可逆呢?我們對這個開運算過程分析一下:

1.假如開運算后的圖像和開運算前的圖像不一樣,比如下面這張圖片:

在這里插入圖片描述

可以看到這張圖片中白色的大部分都比較細小,我們對這張圖片做開運算的時候,我們先腐蝕,很容易就讓一部分的白色的部分消失掉,那么這個白色的部分消失掉之后對腐蝕后的圖片做膨脹消失的白色部分是膨脹不回來的。這些消失的部分就是開運算過程中的不可逆的部分了。

然后我們在后面(img2=開運算前的圖像減去開運算后的圖像),這一步當中就是得到了開運算中消失的那些白色部分了,這一部分就是開運算過程中的不可逆的部分,然后將它疊加到out上。

然后我們通過對圖像不斷的腐蝕,開運算,得到了所有這些圖像中在開運算中不可逆的部分,就得到了我們的骨架了。

2.假如開運算后的圖像和開運算前的圖像不一樣,那這樣的話我們在這一步(img2=開運算前的圖像減去開運算后的圖像)得到img2中的每一個元素就為0了,那在后面out+=img2這一步的時候就out相當于不變,進入下一步循環(huán)在繼續(xù)把白色部分腐蝕地更小,直到得到開運算中出現(xiàn)了不可逆地部分再疊加到out上。

所以粗暴地來說,骨架提取就是對我們地前景區(qū)域,不斷地腐蝕,細化前景,直到將前景壓縮到細地不能再細了。我們的骨架提取提取的就是這一部分。

二.代碼實現(xiàn)

1.預處理

這里我們的圖片是以灰度圖片方式讀取進來的,然后需要閾值處理轉(zhuǎn)換到二值圖。

然后我們的圖片可能會有一些其他的較大的噪聲的影響,我們首先對圖像先進行腐蝕操作,手動過濾掉一些濾波可能無法過濾的較大噪聲。

'''
用于挑選一個好的二值圖
'''
import cv2
import numpy as np
import os

def refine(img_path):
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    # thresh, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    thresh, img = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY)
    h, w = img.shape[0:2]
    #前景背景反轉(zhuǎn)
    for i in range(h):
        for j in range(w):
            if img[i, j] == 255:
                img[i, j] = 0
            else:
                img[i, j] = 255
    cv2.namedWindow("binary", 0)
    cv2.resizeWindow("binary", 640, 480)
    cv2.imshow('binary', img)
    dst = img.copy()

    num_erode = 0

    while (True):
        if np.sum(dst) == 0:
            break
        kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
        dst = cv2.erode(dst, kernel)
        cv2.namedWindow("z", 0)
        cv2.resizeWindow("z", 640, 480)
        cv2.imshow('z', dst)
        c = cv2.waitKey(0)
        if c == ord("q"):
            print("保存")
            cv2.imwrite("./refine.png", dst)
            break
        num_erode = num_erode + 1

if __name__ == '__main__':
    refine("input.png")

在這里需要注意的是我們對圖像進行二值化可能會將我們的背景和前景反轉(zhuǎn),在這里我們需要反轉(zhuǎn)回來。否則的話把反轉(zhuǎn)的代碼注釋掉即可。

我的原圖如下:

在這里插入圖片描述

然后經(jīng)過腐蝕的圖片如下:

在這里插入圖片描述

2. 骨架提取實現(xiàn)

然后下面就是骨架提取的代碼了:

'''
骨架提取
'''
import cv2
import numpy as np

#由于我們經(jīng)過之前的代碼轉(zhuǎn)換到了二值圖,所以這里不需要轉(zhuǎn)換
img = cv2.imread('refine.png', cv2.IMREAD_GRAYSCALE)
dst = img.copy()

skeleton = np.zeros(dst.shape, np.uint8)
while (True):
    if np.sum(dst) == 0:
        break
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
    dst = cv2.erode(dst, kernel, None, None, 1)
    open_dst = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernel)
    result = dst - open_dst
    skeleton = skeleton + result
    cv2.waitKey(1)



cv2.namedWindow("result",0)
cv2.resizeWindow("result",640,480)
cv2.imshow('result', skeleton)
cv2.imwrite("output.png",skeleton)

cv2.waitKey(0)
cv2.destroyAllWindows()

在這里我們可以通過開運算的結(jié)果元大小來稍微調(diào)整一下提取的骨架粗細。

77開運算結(jié)構(gòu)元提取的骨架如下:

在這里插入圖片描述

55開運算結(jié)構(gòu)元提取的骨架如下:

在這里插入圖片描述

 到此這篇關(guān)于深入解析opencv骨架提取的算法步驟的文章就介紹到這了,更多相關(guān)opencv骨架提取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python刪除文件夾中具有相同后綴類型文件的實戰(zhàn)演練

    python刪除文件夾中具有相同后綴類型文件的實戰(zhàn)演練

    在平時卸載軟件的時候會殘留許多文件和空文件夾,下面這篇文章主要給大家介紹了關(guān)于python刪除文件夾中具有相同后綴類型文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Python爬取成語接龍類網(wǎng)站

    Python爬取成語接龍類網(wǎng)站

    在本篇文章里我們給大家分享了關(guān)于Python爬取成語接龍類網(wǎng)站的相關(guān)知識點,有需要的朋友們學習下。
    2018-10-10
  • python使用selenium實現(xiàn)批量文件下載

    python使用selenium實現(xiàn)批量文件下載

    這篇文章主要介紹了python使用selenium實現(xiàn)批量文件下載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • django 將自帶的數(shù)據(jù)庫sqlite3改成mysql實例

    django 將自帶的數(shù)據(jù)庫sqlite3改成mysql實例

    這篇文章主要介紹了django 將自帶的數(shù)據(jù)庫sqlite3改成mysql實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • DataFrame.to_excel多次寫入不同Sheet的實例

    DataFrame.to_excel多次寫入不同Sheet的實例

    今天小編就為大家分享一篇DataFrame.to_excel多次寫入不同Sheet的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python縮進和冒號詳解

    Python縮進和冒號詳解

    下面小編就為大家?guī)硪黄狿ython縮進和冒號詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Pycharm 解決自動格式化沖突的設置操作

    Pycharm 解決自動格式化沖突的設置操作

    這篇文章主要介紹了Pycharm 解決自動格式化沖突的設置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 使用Python實現(xiàn)壓縮pptx的功能

    使用Python實現(xiàn)壓縮pptx的功能

    當處理大型PPTX文件時,其中包含許多高分辨率照片時,文件大小可能會顯著增加,為了解決這個問題,我們可以使用Python編程語言和python-pptx庫來壓縮PPTX文件中的照片,下面我們就來看看具體操作吧
    2024-02-02
  • python模擬點擊在ios中實現(xiàn)的實例講解

    python模擬點擊在ios中實現(xiàn)的實例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python模擬點擊在ios中實現(xiàn)的實例講解內(nèi)容,有需要的朋友們可以參考下。
    2020-11-11
  • 詳解Python是如何實現(xiàn)issubclass的

    詳解Python是如何實現(xiàn)issubclass的

    這篇文章主要介紹了詳解Python是如何實現(xiàn)issubclass的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07

最新評論

镇赉县| 溧水县| 荔波县| 阳新县| 漾濞| 亳州市| 岚皋县| 政和县| 吉木萨尔县| 日照市| 连州市| 合作市| 武陟县| 马边| 长岭县| 茶陵县| 佛冈县| 贵州省| 陕西省| 堆龙德庆县| 丹巴县| 荔波县| 绿春县| 保山市| 连南| 河东区| 油尖旺区| 霍州市| 聂荣县| 昭觉县| 衡东县| 上饶市| 平山县| 志丹县| 临朐县| 兰西县| 竹北市| 蕲春县| 朝阳县| 哈密市| 富宁县|