cvFloodFill漫水填充演算法

2021-07-09 11:46:21 字數 1491 閱讀 1095

這種填充演算法首先要選擇乙個種子點,然後把鄰近區域所有相似點填充上同樣顏色,大多數的填充演算法都與cvfloodfill()類似。

cvfloodfill(img,cvpoint seedpoint,cvscalar newval,cvscalar lodiff,cvscalar updiff,

cvconnectedcomp *comp,int flags,cvarr *mask);

img為輸入影象;seedpoint為種子點;newval是畫素點被染色的值;

lo_diff , up_diff 的解釋就是 如果乙個畫素點的值不低於被染色的相鄰點減去lo_diff 且不高於其加上up_diff,那麼該畫素點就會被染色。這個解釋很是糾結搞得我有點混亂,只能在程式中直觀的去觀察這兩個引數的作用了;

comp ,指向部件結構體的指標,該結構體的內容由函式用重繪區域的資訊填充。opencv中的預設設定為null。

flags 引數比較複雜,包含3部分,低8位部分(0—7位)可以設定為4或8,這個引數控制填充演算法的連通性,就是說填充時是採用4連通還是8連通的方式;

高8位(16-23)可以是 0 或下面的開關選項的組合:

cv_floodfill_fixed_range - 如果設定,則考慮當前象素與種子象素之間的差在指定範圍內才填充,否則考慮當前象素與其相鄰象素的差是否落在指定範圍內;

cv_floodfill_mask_only - 如果設定,函式不填充原始影象 (忽略 new_val), 但填充掩碼影象 (這種情況下 mask 必須是非空的). 此時必須輸入符合要求的掩碼。

flags中間位元位(8-15位)的值指定填充掩碼影象的值。

所有flags可以通過or操作連線起來,比如,用4領域填充,並填充固定畫素值範圍,是填充掩碼而不是填充源影象,以及填充值為58,則flags在opencv中的輸入引數可以設定為:

flags=4|cv_floodfill_fixed_range|cv_floodfill_mask_only|(58<<8);

mask 為運算掩碼,比輸入影象大2個畫素點,既可以作填充函式的輸入值也可以做輸出。如果mask,那麼它必須是乙個單通道、8位、畫素寬度和高度均比源圖大2個畫素的影象。

iplimage *src; //源影象

iplimage *mask; //掩碼影象

iplimage *src1;

int lodiff = 20, updiff = 20;

int connectivity = 4;

int new_mask_val = 255;

void onmouse(int event, int x, int y, int flags, void *param)

break;

case cv_event_rbuttondown:

cvshowimage("image", src1);

break; }}

int main(int argc, char ** argv)

漫水填充演算法

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

漫水填充演算法

漫水填充演算法是填充演算法中最通用的演算法。所謂漫水填充 演算法,是給定乙個聯通域內的乙個點,以此為起點找到這個聯通域的其餘所有點並將其填充為指定顏色的一種演算法。之所以稱之為漫水填充,是因為這種演算法就是模擬了漲水的過程,從一點開始,水流慢慢加大,直到漫過了全部區域。該填充演算法的原型如下所示 v...

opencv 漫水填充

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