Opencv學習 漫水填充演算法

2021-09-24 12:51:27 字數 2673 閱讀 2219

一、漫水填充定義

漫水填充(flood fill)法是用特定的顏色填充聯通區域,通過設定可聯通畫素的上下限以及聯通方式來達到不同的填充效果的方法。主要用來標記和分離影象的一部分以便對其進一步處理和分析。也可以用來從輸入影象獲取掩碼區域,掩碼會加快處理過程,或只處理掩碼指定的畫素點。

所謂漫水填充,簡單來說,就是自動選中了和種子點相連的區域,接著將該區域替換成指定的顏色,這是個非常有用的功能,經常用來標記或者分離影象的一部分進行處理或分析.漫水填充也可以用來從輸入影象獲取掩碼區域,掩碼會加速處理過程,或者只處理掩碼指定的畫素點.

在opencv中,漫水填充是填充演算法中最通用的方法。且在opencv 2.x中,使用c++重寫過的floodfill函式有兩個版本。乙個不帶掩膜mask的版本,和乙個帶mask的版本。這個掩膜mask,就是用於進一步控制哪些區域將被填充顏色(比如說當對同一影象進行多次填充時)。這兩個版本的floodfill,都必須在影象中選擇乙個種子點,然後把臨近區域所有相似點填充上同樣的顏色,不同的是,不一定將所有的鄰近畫素點都染上同一顏色,漫水填充操作的結果總是某個連續的區域。當鄰近畫素點位於給定的範圍(從lodiff到updiff)內或在原始seedpoint畫素值範圍內時,floodfill函式就會為這個點塗上顏色。

來自 二、floodfill函式詳解

opencv中有兩個版本的floodfill函式,如下所示:

python:

retval, image, mask, rect = cv.floodfill( image, mask, seedpoint, newval[, lodiff[, updiff[, flags]]] )

retval, image, mask, rect = cv.floodfill( image, mask, seedpoint, newval[, lodiff[, updiff[, flags]]] )

image:inputoutputarray型別的image, 輸入/輸出1通道或3通道,8位或浮點圖 像,具體引數由之後的引數具體指明。

mask:inputoutputarray型別的mask,這是第二個版本的floodfill獨享的引數, 表示操作掩模,。它應該為單通道、8位、長和寬上都比輸入影象 image 大兩個畫素點的影象。第二個版本的floodfill需要使用以及更新掩膜,所以這個mask引數我們一定要將其準備好並填在此處。需要注意的是,漫水填充不會填充掩膜mask的非零畫素區域。例如,乙個邊緣檢測運算元的輸出可以用來作為掩膜,以防止填充到邊緣。同樣的,也可以在多次的函式呼叫中使用同乙個掩膜,以保證填充的區域不會重疊。另外需要注意的是,掩膜mask會比需填充的影象大,所以 mask 中與輸入影象(x,y)畫素點相對應的點的座標為(x+1,y+1)。

seedpoint:point型別的seedpoint,漫水填充演算法的起始點。

newval:scalar型別的newval,畫素點被染色的值,即在重繪區域畫素的新值。

lodiff:rect*型別的rect,有預設值0,乙個可選的引數,用於設定floodfill函式將要重繪區域的最小邊界矩形區域。

updiff:scalar型別的lodiff,有預設值scalar( ),表示當前觀察畫素值與其部件鄰域畫素值或者待加入該部件的種子畫素之間的亮度或顏色之負差(lower brightness/color difference)的最大值。

rect scalar型別的updiff,有預設值scalar( ),表示當前觀察畫素值與其部件鄰域畫素值或者待加入該部件的種子畫素之間的亮度或顏色之正差(lower brightness/color difference)的最大值。

flags:int型別的flags,操作標誌符,此引數包含三個部分

• floodfill_fixed_range - 如果設定為這個識別符號的話,就會考慮當前畫素與種子畫素之間的差,否則就考慮當前畫素與其相鄰畫素的差。也就是說,這個範圍是浮動的。

• floodfill_mask_only - 如果設定為這個識別符號的話,函式不會去填充改變原始影象 (也就是忽略第三個引數newval), 而是去填充掩模影象(mask)。這個識別符號只對第二個版本的floodfill有用,因第乙個版本裡面壓根就沒有mask引數。

• 中間八位部分,上面關於高八位floodfill_mask_only識別符號中已經說的很明顯,需要輸入符合要求的掩碼。floodfill的flags引數的中間八位的值就是用於指定填充掩碼影象的值的。但如果flags中間八位的值為0,則掩碼會用1來填充。

來自

import cv2

import matplotlib.pyplot as plt

import numpy as np

copyima = img1.copy()

h, w = img1.shape[:2]

print(h, w)

mask = np.zeros([h+2, w+2], np.uint8)

plt.subplot(2, 1, 1)

plt.imshow(img1, cmap='gray')

retval, image, mask, rect = cv2.floodfill(img1, mask, (1480, 1443),

(0, 0, 0), (4, 4, 4), (20, 20, 20))

plt.subplot(2, 1, 2)

plt.imshow(image, cmap='gray')

plt.show()

opencv漫水填充演算法

使用特定的顏色填充連通區域,通過設定可連通畫素的上下限以及連通方式達到不同的填充效果。int floodfill inputoutputarray image,point seedpoint,scalar newval,rect rect 0,scalar lodiff scalar scalar ...

opencv 漫水填充

一 話說漫水填充 漫水填充是一種用特定的顏色填充連通區域,通過設定可連通畫素的上下限以及連通方式達到不同的填充效果的方法。漫水填充經常用來標記或者是分離影象的一部分,以便對其進行進一步處理貨分析,也可以用來從輸入影象獲取掩碼區域,掩碼會加速處理過程,或者只處理指定的畫素點,操作的結果總是某個連續的區...

漫水填充演算法

所謂漫水填充演算法,是給定乙個聯通域內的乙個點,以此為起點找到這個聯通域的其餘所有點並將其填充為指定顏色的一種演算法。之所以稱之為漫水填充,是因為這種演算法就是模擬了漲水的過程,從一點開始,水流慢慢加大,直到漫過了全部區域。這個演算法的詳細介紹可以參考下面的鏈結。這個演算法在我們尋找一片指定區域時非...