欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python經(jīng)典案例之圖像漫水填充分割詳解

 更新時間:2023年01月28日 11:48:13   作者:Eastmount  
圖像分割是將圖像分成若干具有獨特性質(zhì)的區(qū)域并提取感興趣目標(biāo)的技術(shù)和過程,這篇文章將詳細(xì)講解漫水填充分割應(yīng)用,感興趣的小伙伴可以了解一下

一.圖像漫水填充

圖像漫水填充(FloodFill)是指用一種特定的顏色填充聯(lián)通區(qū)域,通過設(shè)置可連通像素的上下限以及連通方式來達(dá)到不同的填充效果。漫水填充通常被用來標(biāo)記或分離圖像的一部分以便對其進(jìn)行深入的處理或分析。

圖像漫水填充主要是遴選出與種子點聯(lián)通且顏色相近的像素點,接著對像素點的值進(jìn)行處理。如果遇到掩碼,則根據(jù)掩碼進(jìn)行處理。其原理類似Photoshop的魔術(shù)棒選擇工具,漫水填充將查找和種子點聯(lián)通的顏色相同的點,而魔術(shù)棒選擇工具是查找和種子點聯(lián)通的顏色相近的點,將和初始種子像素顏色相近的點壓進(jìn)棧作為新種子?;竟ぷ鞑襟E如下:

  • 選定種子點(x,y);
  • 檢查種子點的顏色,如果該點顏色與周圍連接點的顏色不相同,則將周圍點顏色設(shè)置為該點顏色;如果相同則不做處理。但是周圍點不一定都會變成和種子點的顏色相同,如果周圍連接點在給定的范圍(從loDiff到upDiff)內(nèi)或在種子點的像素范圍內(nèi)才會改變顏色;
  • 檢測其他連接點,進(jìn)行第2個步驟的處理,直到?jīng)]有連接點,即到達(dá)檢測區(qū)域邊界停止。

二.圖像漫水填充分割實現(xiàn)

在OpenCV中,主要通過floodFill()函數(shù)實現(xiàn)漫水填充分割,它將用指定的顏色從種子點開始填充一個連接域。其函數(shù)原型如下所示:

floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]])

– image表示輸入/輸出1通道或3通道,6位或浮點圖像

– mask表示操作掩碼,必須為8位單通道圖像,其長寬都比輸入圖像大兩個像素點。注意,漫水填充不會填充掩膜mask的非零像素區(qū)域,mask中與輸入圖像(x,y)像素點相對應(yīng)的點的坐標(biāo)為(x+1,y+1)。

– seedPoint為Point類型,表示漫水填充算法的起始點

– newVal表示像素點被染色的值,即在重繪區(qū)域像素的新值

– loDiff表示當(dāng)前觀察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或顏色之負(fù)差的最大值,默認(rèn)值為Scalar( )

– upDiff表示當(dāng)前觀察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或顏色之正差的最大值,默認(rèn)值為Scalar( )

– flags表示操作標(biāo)識符,此參數(shù)包括三個部分:低八位0-7bit表示鄰接性(4鄰接或8鄰接);中間八位8-15bit表示掩碼的填充顏色,如果中間八位為0則掩碼用1來填充;高八位16-31bit表示填充模式,可以為0或者以下兩種標(biāo)志符的組合,F(xiàn)LOODFILL_FIXED_RANGE表示此標(biāo)志會考慮當(dāng)前像素與種子像素之間的差,否則就考慮當(dāng)前像素與相鄰像素的差。FLOODFILL_MASK_ONLY表示函數(shù)不會去填充改變原始圖像,而是去填充掩碼圖像mask,mask指定的位置為零時才填充,不為零不填充。

在Python和OpenCV實現(xiàn)代碼中,它設(shè)置種子點位置為(10,200);設(shè)置顏色為黃色(0,255,255);連通區(qū)范圍設(shè)定為loDiff和upDiff;標(biāo)記參數(shù)設(shè)置為CV_FLOODFILL_FIXED_RANGE ,它表示待處理的像素點與種子點作比較,在范圍之內(nèi),則填充此像素,即種子漫水填充滿足:

src(seed.x, seed.y) - loDiff <= src(x, y) <= src(seed.x, seed.y) +upDiff

完整代碼如下:

# -*- coding: utf-8 -*-
# By: Eastmount
import cv2
import numpy as np

#讀取原始圖像
img = cv2.imread('windows.png')

#獲取圖像行和列
rows, cols = img.shape[:2]

#目標(biāo)圖像
dst = img.copy()

#mask必須行和列都加2且必須為uint8單通道陣列
#mask多出來的2可以保證掃描的邊界上的像素都會被處理
mask = np.zeros([rows+2, cols+2], np.uint8)  

#圖像漫水填充處理
#種子點位置(30,30) 設(shè)置顏色(0,255,255) 連通區(qū)范圍設(shè)定loDiff upDiff
#src(seed.x, seed.y) - loDiff <= src(x, y) <= src(seed.x, seed.y) +upDiff
cv2.floodFill(dst, mask, (30, 30), (0, 255, 255),
              (100, 100, 100), (50, 50, 50),
              cv2.FLOODFILL_FIXED_RANGE)

#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

輸出結(jié)果如圖1所示,左邊為原始圖像,右邊為將Windows圖標(biāo)周圍填充為黃色的圖像。

三.圖像漫水填充分割自動軟件

下面補充另一段代碼,它將打開一幅圖像,點擊鼠標(biāo)選擇種子節(jié)點,移動滾動條設(shè)定連通區(qū)范圍的loDiff和upDiff值,并產(chǎn)生動態(tài)的漫水填充分割。

注意,該部分代碼中涉及鼠標(biāo)、鍵盤、滾動條等操作,希望讀者下來學(xué)習(xí)相關(guān)知識,該系列文章更多是講解Python圖像處理的算法原理及代碼實現(xiàn)。

# coding:utf-8
import cv2
import random
import sys
import numpy as np

#使用說明 點擊鼠標(biāo)選擇種子點
help_message = '''USAGE: floodfill.py [<image>]
Click on the image to set seed point
Keys:
  f - toggle floating range
  c - toggle 4/8 connectivity
  ESC - exit
'''
 
if __name__ == '__main__':

    #輸出提示文本
    print(help_message)

    #讀取原始圖像
    img = cv2.imread('scenery.png')

    #獲取圖像高和寬
    h, w = img.shape[:2]

    #設(shè)置掩碼 長和寬都比輸入圖像多兩個像素點 
    mask = np.zeros((h+2, w+2), np.uint8)

    #設(shè)置種子節(jié)點和4鄰接
    seed_pt = None
    fixed_range = True
    connectivity = 4 

    #圖像漫水填充分割更新函數(shù)
    def update(dummy=None):
        if seed_pt is None:
            cv2.imshow('floodfill', img)
            return
        
        #建立圖像副本并漫水填充
        flooded = img.copy()
        mask[:] = 0 #掩碼初始為全0
        lo = cv2.getTrackbarPos('lo', 'floodfill') #像素鄰域負(fù)差最大值
        hi = cv2.getTrackbarPos('hi', 'floodfill') #像素鄰域正差最大值
        print('lo=', lo, 'hi=', hi)

        #低位比特包含連通值 4 (缺省) 或 8
        flags = connectivity
        
        #考慮當(dāng)前像素與種子像素之間的差(高比特也可以為0)
        if fixed_range:
            flags |= cv2.FLOODFILL_FIXED_RANGE
            
        #以白色進(jìn)行漫水填充
        cv2.floodFill(flooded, mask, seed_pt,
                      (random.randint(0,255), random.randint(0,255),
                       random.randint(0,255)), (lo,)*3, (hi,)*3, flags)

        #選定基準(zhǔn)點用紅色圓點標(biāo)出
        cv2.circle(flooded, seed_pt, 2, (0, 0, 255), -1)
        print("send_pt=", seed_pt)

        #顯示圖像
        cv2.imshow('floodfill', flooded)

    #鼠標(biāo)響應(yīng)函數(shù)
    def onmouse(event, x, y, flags, param):
        global seed_pt #基準(zhǔn)點

        #鼠標(biāo)左鍵響應(yīng)選擇漫水填充基準(zhǔn)點
        if flags & cv2.EVENT_FLAG_LBUTTON:
            seed_pt = x, y
            update()

    #執(zhí)行圖像漫水填充分割更新操作
    update()
    
    #鼠標(biāo)更新操作
    cv2.setMouseCallback('floodfill', onmouse)

    #設(shè)置進(jìn)度條
    cv2.createTrackbar('lo', 'floodfill', 20, 255, update)
    cv2.createTrackbar('hi', 'floodfill', 20, 255, update)

    #按鍵響應(yīng)操作
    while True:
        ch = 0xFF & cv2.waitKey()
        #退出
        if ch == 27:
            break
        #選定時flags的高位比特位0
        #鄰域的選定為當(dāng)前像素與相鄰像素的差, 聯(lián)通區(qū)域會很大
        if ch == ord('f'):
            fixed_range = not fixed_range 
            print('using %s range' % ('floating', 'fixed')[fixed_range])
            update()
        #選擇4方向或則8方向種子擴散
        if ch == ord('c'):
            connectivity = 12-connectivity 
            print('connectivity =', connectivity)
            update()
    cv2.destroyAllWindows()

當(dāng)鼠標(biāo)選定的種子點為(242,96),觀察點像素鄰域負(fù)差最大值“lo”為138,觀察點像素鄰域正差最大值“hi”為147時,圖像漫水填充效果如圖2所示,它將天空和中心水面填充成黃色。

當(dāng)鼠標(biāo)選定的種子點為(328, 202),觀察點像素鄰域負(fù)差最大值“lo”為142,觀察點像素鄰域正差最大值“hi”為45時,圖像漫水填充效果如圖3所示,它將圖像兩旁的森林和水面填充成藍(lán)紫色。

四.總結(jié)

寫到這里,圖像分割知識點就介紹完畢,包括基于閾值的圖像分割方法、基于邊緣檢測的圖像分割方法、基于紋理背景的圖像分割方法和基于特定理論的圖像分割方法。其中,基于特定理論的分割方法又分別講解了基于K-Means聚類、均值漂移、分水嶺算法的圖像分割方法。最后通過漫水填充分割案例加深了讀者的印象。希望讀者能結(jié)合本章知識點,圍繞自己的研究領(lǐng)域或工程項目進(jìn)行深入的學(xué)習(xí),實現(xiàn)所需的圖像處理。

以上就是Python經(jīng)典案例之圖像漫水填充分割詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像漫水填充分割的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬蟲庫urllib的使用教程詳解

    Python爬蟲庫urllib的使用教程詳解

    Python?給人的印象是抓取網(wǎng)頁非常方便,提供這種生產(chǎn)力的,主要依靠的就是?urllib、requests這兩個模塊。本文主要給大家介紹一下urllib的使用,感興趣的可以了解一下
    2022-11-11
  • python GUI計算器的實現(xiàn)

    python GUI計算器的實現(xiàn)

    這篇文章主要介紹了python gui計算器的實現(xiàn),幫助大家更好的理解和學(xué)習(xí)python gui編程,感興趣的朋友可以了解下
    2020-10-10
  • python?sys模塊使用方法介紹

    python?sys模塊使用方法介紹

    sys模塊功能多,我們這里介紹一些比較實用的功能,相信你會喜歡的,和我一起走進(jìn)python的模塊吧
    2023-01-01
  • Python進(jìn)程崩潰AttributeError異常問題解決

    Python進(jìn)程崩潰AttributeError異常問題解決

    這篇文章主要介紹了Python進(jìn)程崩潰(AttributeError異常)問題解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下方法
    2023-06-06
  • python搭建虛擬環(huán)境的步驟詳解

    python搭建虛擬環(huán)境的步驟詳解

    相信每位python都知道,進(jìn)行不同的python項目開發(fā),有的時候會遇到這樣的情況:python 版本不一樣,使用的軟件包版本不一樣。這種問題最佳的解決辦法是為不同的項目搭建獨立的 python 環(huán)境。下面來一起看看吧。
    2016-09-09
  • Django動態(tài)隨機生成溫度前端實時動態(tài)展示源碼示例

    Django動態(tài)隨機生成溫度前端實時動態(tài)展示源碼示例

    本篇文章主要描述的是在動態(tài)隨機生成溫度,在前端動態(tài)實時展示,主要用到兩個東西,一個是APScheduler定時任務(wù) 和websocket,最后利用echarts將數(shù)據(jù)展示出來,下面對這兩個分別進(jìn)行詳細(xì)的解說
    2021-09-09
  • Pandas實現(xiàn)Dataframe的重排和旋轉(zhuǎn)

    Pandas實現(xiàn)Dataframe的重排和旋轉(zhuǎn)

    使用Pandas的pivot方法可以將DF進(jìn)行旋轉(zhuǎn)變換,本文將會詳細(xì)講解pivot的秘密,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Django與JS交互的示例代碼

    Django與JS交互的示例代碼

    本篇文章主要介紹了Django與JS交互的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 詳解Python 多線程 Timer定時器/延遲執(zhí)行、Event事件

    詳解Python 多線程 Timer定時器/延遲執(zhí)行、Event事件

    這篇文章主要介紹了Python 多線程 Timer定時器/延遲執(zhí)行、Event事件的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Python字符串、列表、元組、字典、集合的補充實例詳解

    Python字符串、列表、元組、字典、集合的補充實例詳解

    這篇文章主要介紹了Python字符串、列表、元組、字典、集合,結(jié)合實例形式詳細(xì)分析了Python字符串、列表、元組、字典、集合常見函數(shù)使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-12-12

最新評論