OpenCV3.0 Examples學習筆記(7)-ffilldemo.cpp
來源:程序員人生 發布時間:2017-03-08 08:18:13 閱讀次數:7408次
這個系列的目的是通過對OpenCV示例,進1步了解OpenCV函數的使用,不觸及具體原理。
目錄
簡介
Example運行截圖
Example分析
Example代碼
簡介
本文記錄了對OpenCV示例ffilldemo.cpp的分析。
資料地址:http://docs.opencv.org/3.0.0/d5/d26/ffilldemo_8cpp-example.html
這個示例主要講述了如何使用floodFill函數,floodFill1般被譯為漫水填充。
floodFill算法原理
漫水填充法基于種子填充法對選中的圖象進行處理,對選中位置和與其聯通并“色彩相近”的點都填充為指定色彩。
1.floodFill有3種模式判斷是不是為相近色彩
(1)null range 必須完全相同
src(seedPoint.x,seedPoint.y)
== src(x′,y′)
(2)fixed range 滿足固定浮動范圍
src(seedPoint.x,seedPoint.y)?loDiff≤src(x,y)≤src(seedPoint.x,seedPoint.y)+upDiff
(3)floating
range 滿足漸變的浮動范圍
src(x′,y′)?loDiff≤src(x,y)≤src(x′,y′)+upDiff
以下為在相同位置,相同參數情況下,不同模式填充的情況
模式
|
填充效果演示
|
null range
|
|
fixed range
|
|
floating range
|
|
2.對灰度圖象和彩色圖象判斷是不是為相近色彩
(1)對灰度圖象,灰度值滿足條件
(2)對彩色圖象,需r,g,b3個通道都滿足條件
3.mask的使用
很多時候可以選擇先用邊沿檢測選取,以后再做填充,如此可以對指定的位置進行處理。
漫水填充法除用于色彩填充之外,更常見于將圖象進行標記,有很多時候用來做類似連通域分析的工作。
floodFill在OpenCV中的原型
floodFill
函數原型:
int floodFill( InputOutputArray image, InputOutputArray mask,
Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0,
Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
int flags = 4 );
參數說明:
image:
- InputOutputArray類型的image, 輸入/輸出1通道或3通道,8位或浮點圖象,具體參數由以后的參數具體指明。
mask:
- InputOutputArray類型的mask,這是第2個版本的floodFill獨享的參數,表示操作掩模,。它應當為單通道、8位、長和寬上都比輸入圖象 image 大兩個像素點的圖象。第2個版本的floodFill需要使用和更新掩膜,所以這個mask參數我們1定要將其準備好并填在此處。需要注意的是,漫水填充不會填充掩膜mask的非零像素區域。例如,1個邊沿檢測算子的輸出可以用來作為掩膜,以避免填充到邊沿。一樣的,也能夠在屢次的函數調用中使用同1個掩膜,以保證填充的區域不會堆疊。另外需要注意的是,掩膜mask會比需填充的圖象大,所以
mask 中與輸入圖象(x,y)像素點相對應的點的坐標為(x+1,y+1)。
seedPoint:
- Point類型的seedPoint,漫水填充算法的起始點。
newVal:
- Scalar類型的newVal,像素點被染色的值,即在重繪區域像素的新值。
rect:
- Rect*類型的rect,有默許值0,1個可選的參數,用于設置floodFill函數將要重繪區域的最小邊界矩形區域。
loDiff
:
- Scalar類型的loDiff,有默許值Scalar( ),表示當前視察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或色彩之負差(lower brightness/color difference)的最大值。
upDiff
:
- Scalar類型的upDiff,有默許值Scalar( ),表示當前視察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或色彩之正差(lower brightness/color difference)的最大值。
flags
:
- int類型的flags,操作標志符,此參數包括3個部份,比較復雜,我們1起詳細看看。
- 低8位(第0~7位)用于控制算法的連通性,可取4
(4為缺省值) 或 8。如果設為4,表示填充算法只斟酌當前像素水平方向和垂直方向的相鄰點;如果設為 8,除上述相鄰點外,還會包括對角線方向的相鄰點。
- 高8位部份(16~23位)可以為0
或以下兩種選項標識符的組合:
- FLOODFILL_FIXED_RANGE-
如果設置為這個標識符的話,就會斟酌當前像素與種子像素之間的差,否則就斟酌當前像素與其相鄰像素的差。也就是說,這個范圍是浮動的。
- FLOODFILL_MASK_ONLY - 如果設置為這個標識符的話,函數不會去填充改變原始圖象 (也就是疏忽第3個參數newVal),
而是去填充掩模圖象(mask)。這個標識符只對第2個版本的floodFill有用,因第1個版本里面壓根就沒有mask參數。
- 中間8位部份,上面關于高8位FLOODFILL_MASK_ONLY標識符中已說的很明顯,需要輸入符合要求的掩碼。Floodfill的flags參數的中間8位的值就是用于指定填充掩碼圖象的值的。但如果flags中間8位的值為0,則掩碼會用1來填充。
而所有flags可以用or操作符連接起來,即“|”。例如,如果想用8鄰域填充,并填充固定像素值范圍,填充掩碼而不是填充源圖象,和設填充值為38,那末輸入的參數是這樣:
flags=8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE | (38<<8)
|
floodFill
OpenCV還提供了1個不支持mask的版本,除沒有mask其他都完全相同。
函數原型:
int floodFill( InputOutputArray image,
Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0,
Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
int flags = 4 );
|
Example截圖
原圖
|
處理結果
|
參數
|
|
|
ffillMode = 1(Fixed Range)
|
Example分析
1.申明需要使用的變量
Mat image0, image, gray, mask;
int ffillMode = 1;
int loDiff = 20, upDiff = 20;
int connectivity = 4;
int isColor = true;
bool useMask = false;
int newMaskVal = 255;
注意:
(1)image0保存源圖象;
(2)image為處理后的圖象,用于顯示處理結果;
(3)gray為灰度圖象,由源圖象轉換;
(4)mask掩膜;
(5)ffillMode
a. ffillMode
= 0,null range 必須完全相同
b. ffillMode
= 1,fixed range 滿足固定浮動范圍
c. ffillMode = 2,floating
range 滿足漸變的浮動范圍
(6)loDiff 浮動閾值
(7)upDiff浮動閾值
(8)connectivity
聯通域方式
a. connectivity = 4,4聯通
b. connectivity =
8,8聯通
(9)isColor
是不是使用彩色模式
(10)useMask
是不是使用掩膜
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈