1. 程式人生 > >Opencv Python版學習筆記(二)漫水填充

Opencv Python版學習筆記(二)漫水填充

漫水填充:也就是用一定顏色填充聯通區域,通過設定可連通畫素的上下限以及連通方式來達到不同的填充效果;

程式說明依舊以註釋的形式寫出,在Python例程的基礎上修改為隨機顏色填充:

#decoding:utf-8

import numpy as np
import cv2
import random

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__':
    import sys
    try: fn = sys.argv[1]
    except: fn = 'E:/lena.jpg'
    print help_message

    img = cv2.imread(fn, True)
    h, w = img.shape[:2]#得到影象的高和寬
    mask = np.zeros((h+2, w+2), np.uint8)#掩碼單通道8位元,長和寬都比輸入影象多兩個畫素點,滿水填充不會超出掩碼的非零邊緣
    seed_pt = None
    fixed_range = True
    connectivity = 4

    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')#觀察點畫素鄰域負差最大值(也就是與選定畫素多少差值內的歸為同一區域)
        hi = cv2.getTrackbarPos('hi', 'floodfill')#觀察點畫素鄰域正差最大值
        flags = connectivity#低位位元包含連通值, 4 (預設) 或 8
        if fixed_range:
            flags |= cv2.FLOODFILL_FIXED_RANGE #考慮當前象素與種子象素之間的差(高位元也可以為0)
        #以白色進行漫水填充
        cv2.floodFill(flooded, mask, seed_pt, (random.randint(0,255), random.randint(0,255), random.randint(0,255)), (lo,)*3, (hi,)*3, flags)
        
        cv2.circle(flooded, seed_pt, 2, (0, 0, 255), -1)#選定基準點用紅色圓點標出
        cv2.imshow('floodfill', flooded)

    def onmouse(event, x, y, flags, param):#滑鼠響應函式
        global seed_pt
        if flags & cv2.EVENT_FLAG_LBUTTON:#滑鼠左鍵響應,選擇漫水填充基準點
            seed_pt = x, y
            update()

    update()
    cv2.setMouseCallback('floodfill', onmouse)
    cv2.createTrackbar('lo', 'floodfill', 20, 255, update)
    cv2.createTrackbar('hi', 'floodfill', 20, 255, update)

    while True:
        ch = 0xFF & cv2.waitKey()
        if ch == 27:
            break
        if ch == ord('f'):
            fixed_range = not fixed_range #選定時flags的高位位元位0,也就是鄰域的選定為當前畫素與相鄰畫素的的差,這樣的效果就是聯通區域會很大
            print 'using %s range' % ('floating', 'fixed')[fixed_range]
            update()
        if ch == ord('c'):
            connectivity = 12-connectivity #選擇4方向或則8方向種子擴散
            print 'connectivity =', connectivity
            update()
    cv2.destroyAllWindows()             

相關推薦

Opencv Python學習筆記填充

漫水填充:也就是用一定顏色填充聯通區域,通過設定可連通畫素的上下限以及連通方式來達到不同的填充效果; 程式說明依舊以註釋的形式寫出,在Python例程的基礎上修改為隨機顏色填充: #decoding:utf-8 import numpy as np import cv2

Opencv Python學習筆記模板匹配

模板匹配:模板匹配是通過目標圖片在待匹配圖片進行遍歷,通過選擇一定的匹配方式能夠得到每個起始畫素點的匹配值,最終匹配值最大的位置就是候選匹配位置,也就達到了匹配查詢的效果 本例是通過滑鼠選取影象中的一塊矩形區域,遍歷原影象後得到一個匹配值矩陣,將矩陣轉換成0-255的灰度影

python基礎教程第三)學習筆記

第二章 列表和元組 2.1序列概述 Python內建的序列包括列表、元組、字串、Unicode字串、buffer物件和xrange物件等,本章僅介紹列表和元組。 列表和元組的主要不同在於,列表的元素是可以修改的,而元組不可以單獨更改其中的單個元素,但可以更改元組的整體內容。 在序列中,每個元素都有編

Python爬蟲學習筆記——requests庫的使用

pip 安裝 .text rep 瀏覽器 ror clas ade 學習筆記 準備工作 requests庫不是python自帶的庫,可以用pip安裝。在使用時導入requests即可。 基本用法 GET請求 r = requests.get(url) print(r.tex

python入門學習筆記——列表

3.列表 3.1使用列表的值 name = ['dad','sss','ff'] print(name) print(name[0]) print(name[-1].upper()) 3.2修改列表值 name[-1] = 'aa' print(name) 3

SQL入門經典(第5)學習筆記

1.判斷對錯:個人社會保險號碼,輸入格式為 '1111111111',它可以是下面任何一種資料型別:定長字元、變長字元、數值。錯 不能是數值 引號會轉換為字元 2.判斷對錯:數值型別的標度是指數值的總體長度。對 會自動補全 3.所有的SQL實現都使用同樣的資料型別嗎?不同 按需使用 4.下面定義的有效位

Python基礎學習筆記

一、Windows平臺 1、下載Python 3.6.4 https://www.python.org/ 2、雙擊安裝即可,注意點選Add python 3.6 to path 3、win+r 輸入cmd 開啟控制檯 輸入python命令,檢視是

opencv 視覺專案學習筆記: 基於 svm 和 knn 車牌識別

車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測影象中感興趣區域; 2)特徵提取: 對字元影象集中的每個部分進行提取; 3)分類: 判斷影象快是不是車牌或者 每個車牌字元的分類。 車牌識別分為兩個步驟, 車牌檢測, 車牌識別, 都屬於模式識別。 基本結構如下: 一、車牌

python爬蟲學習筆記——基礎篇之爬蟲基本原理

包括 for .py 非關系型 原理 sof 301跳轉 close bsp 1.什麽是爬蟲?   請求網站並提取數據的自動化程序 2.爬蟲基本流程  2.1發起請求   通過HTTP庫向目標站點發起請求,即發起一個Request,請求可以包含額外的headers等信息,等

Python + OpenCV 學習筆記>>> 載入視訊流

在這有一點要注意: 由於我使用的是樹莓派原裝攝像頭,故不能直接被cv.VideoCapture(0) 所檢測到,所以要先修改/etc/modules 檔案,在其末尾新增bcm2835-v4l2,儲存重啟,隨後在/dev/目錄中就能發現多了個video0 裝置 import cv2 a

Opencv Python學習筆記 字元識別-分類器SVM,KNearest,RTrees,Boost,MLP

Opencv提供了幾種分類器,例程裡通過字元識別來進行說明的 1、支援向量機(SVM):給定訓練樣本,支援向量機建立一個超平面作為決策平面,使得正例和反例之間的隔離邊緣被最大化。 函式原型:訓練原型 cv2.SVM.train(trainData, responses[, varIdx[,

Spark (Python) 零基礎學習筆記—— Spark Transformations總結及舉例

1. map(func) 將func函式作用到資料集的每個元素,生成一個新的分散式的資料集並返回 >>> a = sc.parallelize(('a', 'b', 'c')) >>> a.map(lambda x:

算法第四學習筆記——初級排序算法

space 倒序 優勢 name 算法 turn 資料 eply n) 時間復雜度(Time Complexity): 總運算次數表達式中受n的變化影響最大的那一項(不含系數)(註:若算法中語句執行次數為一個常數,則時間復雜度為O(1)) 若T(n)/f(n)求極限可得

Python學習筆記

== 文字 編碼 無法 比較運算 一個 unicode編碼 變量 組成 一、Python中的數據類型   Python是一種弱類型的編程語言,但具體到對數據的操作時,仍存在和必須涉及到具體的數據類型的概念。  Python中的基本數據類型可以分為:    數值類型:整型、浮

python學習筆記列表操作

練習 位數組 post print ihe 之間 反轉 st2 money 列表及列表操作:   列表是最常用的數據類型之一,列表也叫數組,列表定義,使用[]即可;列表裏面可以再套列表,一個裏面套一個列表,叫二維數組;一個裏面套一個列表,裏面的列表再套一個列表,這個叫三位數

Boost Python學習筆記

通過 cmak cat 結構 固定 動物類 程序 virt 使用配置 你將學到什麽 如何在Python中調用C++代碼 如何在C++中調用Python代碼 在Python中調用C++代碼 首先定義一個動物類(include/animal.h) #pragma once

python3學習筆記Python初識

區別 說明 from 學習筆記 情況 不能 col 需要 學習 一、算法 在開始認真地編程之前,首先來解釋下什麽是計算機程序設計。簡單地說,它就是告訴計算機要做什麽。計算機可以做很多事情,但是它不會自己思考,需要我們告訴它具體細節,並且使用計算機能夠理解的語言把算法告

opencv 視覺項目學習筆記: 基於 svm 和 knn 車牌識別

its ++ eas -a rect() repr poi obj std 車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測圖像中感興趣區域; 2)特征提取: 對字符圖像集中的每個部分進行提取; 3)分類: 判斷圖像快是不是車牌或者 每

python基礎教程第三)學習筆記

第六章 抽象(函式) 6.1 懶惰是一種美德 6.2 抽象和結構 6.3 自定義函式 判斷某個物件是否可呼叫,可使用內建函式callable。格式是callable(物件)。 函式是結構化程式設計的核心。使用def(表示定義函式)語句。 '''   def fun(str_s): #

python基礎教程第三)學習筆記

第四章 字典 字典一種可通過名稱來訪問其各個值的資料結構。這種資料結構稱為對映。字典是Python中唯一的內建對映型別,其中的值不按順序排列,而是儲存在鍵下。鍵可能是數、字串或元組。 4.1 字典的用途 i表示棋盤的狀態,其中每個鍵都是由座標組成的元組; ii儲存檔案修改時間,其中的鍵為檔名; ii