影象處理_常用函式_OpenCV
1.cvFindContours
函式cvFindContours從二值影象中檢索輪廓,並返回檢測到的輪廓的個數。first_contour的值由函式填充返回,它的值將為第一個外輪廓的指標,當沒有輪廓被檢測到時為NULL。其它輪廓可以使用h_next和v_next連線,從first_contour到達。
image:8位元單通道的源二值影象。非零畫素作為1處理,0畫素儲存不變。從一個灰度影象得到二值影象的函式有:cvThreshold,cvAdaptiveThreshold和cvCanny。int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
storage:返回輪廓的容器。
first_contour:輸出引數,用於儲存指向第一個外接輪廓。
header_size:header序列的尺寸.如果選擇method = CV_CHAIN_CODE, 則header_size >= sizeof(CvChain);其他,則header_size >= sizeof(CvContour)。
mode:檢索模式,可取值如下:
(1)CV_RETR_EXTERNAL:只檢索最外面的輪廓;
(2)CV_RETR_LIST:檢索所有的輪廓,並將其放入list中;
(3)CV_RETR_CCOMP:檢索所有的輪廓,並將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;
(4)CV_RETR_TREE:檢索所有的輪廓,並重構巢狀輪廓的整個層次。
藍色表示v_next,綠色表示h_next
method:邊緣近似方法(除了CV_RETR_RUNS使用內建的近似,其他模式均使用此設定的近似演算法)。可取值如下:(1)CV_CHAIN_CODE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。
(2)CV_CHAIN_APPROX_NONE:將所有的連碼點,轉換成點。
(3)CV_CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函式只保留他們的終點部分。
(4)CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似演算法的一種。
(5)CV_LINK_RUNS:通過連線水平段的1,使用完全不同的邊緣提取演算法。使用CV_RETR_LIST檢索模式能使用此方法。
offset:偏移量,用於移動所有輪廓點。當輪廓是從影象的ROI提取的,並且需要在整個影象中分析時,這個引數將很有用。
2. cvMoveWindow
該函式為開放計算機視覺(OpenCV)庫庫函式,設定視窗的位置。
定義:
void cvMoveWindow( constchar* name, int x, int y );
引數:name 將被設定的視窗的名字。
x 視窗左上角的x座標。
y 視窗左上角的y座標。
函式cvMoveWindow改變視窗的位置。
3.cvResizeWindow
該函式為開放計算機視覺(OpenCV)庫庫函式,設定視窗大小。
定義:
voidcvResizeWindow( const char* name, int width, int height );
引數:name 將被設定視窗的名字。
width 新的視窗寬度。
height 新的視窗高度。
4.void cvSmooth
void cvSmooth( const CvArr* src,CvArr* dst,int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, doubleparam3=0 ,double param4=0);
src:輸入影象.
dst:輸出影象.
smoothtype:平滑方法
平滑方法
(1)CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊)- 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函式 cvIntegral 計算積分影象。
(2)CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換1/(param1.param2).
(3)CV_GAUSSIAN (gaussian blur) - 對影象進行核大小為param1×param2 的高斯卷積
(4)CV_MEDIAN (median blur) - 對影象進行核大小為param1×param1 的中值濾波(i.e. 鄰域是方的).
(5)CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色sigma=param1,空間sigma=param2. 平滑操作的第一個引數.
param2:平滑操作的第二個引數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值為零,則表示其被設定為param1。
param3:對應高斯引數的 Gaussian sigma (標準差). 如果為零,則標準差由下面的核尺寸計算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核,n=param2 對應垂直核.
對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作).函式 cvSmooth 可使用上面任何一種方法平滑影象。每一種方法都有自己的特點以及侷限。沒有縮放的影象平滑僅支援單通道影象,並且支援8位到16位的轉換(與cvSobel和cvLaplace相似)和32位浮點數到32位浮點數的變換格式。簡單模糊和高斯模糊支援 1- 或 3-通道, 8-位元和
32-位元浮點影象。這兩種方法可以(in-place)方式處理影象。中值和雙向濾波工作於 1- 或 3-通道, 8-點陣圖像,但是不能以 in-place 方式處理影象.
註解:
(1)可能大家對CvArr的理解不是很深刻,可以將其看做C++中的基類,當然也包括IplImage
(2)smooth支援的型別:
CV_BLUR簡單模糊 對每個畫素param1,param2求和,並縮放1/(param1*param2),亦即求簡單平均值
CV_BLUR_NO_SCALE簡單無縮放變化的模糊 對每個畫素param1,param2求和 特別說明的是輸入影象和結果影象必須有不同的數值精度,以保證不會發生溢位,如果源影象是8u,則結果影象必須是16s或者32s
CV_MEDIAN中值模糊 取中心畫素的正方形領域類的每個畫素的值用中間值代替
CV_GAUSSIAN高斯模糊 param3為零時,高斯卷積核sigma通過以下公式計算
sigma(x)= (n(x)/2-1)*0.30+0.80,n(x)=param1
sigma(y)= (n(y)/2-1)*0.30+0.80,n(y)=param2
如果第四個引數指定,則第三個和第四個引數分別表示sigma的水平方向和垂直方向的值;如果第三個,第四個引數已經指定,而前兩個引數為0,那麼視窗的尺寸由sigma確定
CV_BILATERAL雙向濾波 因為高斯模糊是在影象在空間內的畫素是緩慢變化的,但隨機的兩個點可能形成很大的畫素差,高斯濾波在保留訊號的條件下減少噪聲,但在接近邊緣的地方無效,雙向濾波可以解決這個問題,但需要更多的時間代價,其需要兩個引數,param1表示空域中所使用的高斯核的寬度,param2表示顏色域高斯核的高度。
5.cvPyrDown
功能:
函式cvPyrDown使用Gaussian金字塔分解對輸入影象向下取樣。
格式:
voidcvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
引數:src 輸入影象。
dst 輸出影象,其寬度和高度應是輸入影象的一半。
filter 卷積濾波器型別,目前僅支援CV_GAUSSIAN_5x5。
6.cvPyrUp
opencv庫中函式用於影象的上取樣
void cvPyrUp( const CvArr* src, CvArr* dst, intfilter=CV_GAUSSIAN_5x5 );
src 輸入影象. dst 輸出影象,寬度和高度應是輸入影象的2倍
filter 卷積濾波器的型別,目前僅支援CV_GAUSSIAN_5x5 函式 cvPyrUp使用Gaussian金字塔分解對輸入影象向上取樣。首先通過在影象中插入偶數行和偶數列,然後對得到的影象用指定的濾波器進行高斯卷積,其中濾波器乘以4做插值。所以輸出影象是輸入影象的 4倍大小。
7.cvRunningAvg
作用:用來更新移動平均。
函式形式:
void cvRunningAvg(const CvArr * image, CvArr* acc, double alpha,const CvArr* mask=NULL)
引數說明:
image:輸入影象,1或3通道,8位元或32位元的float型
acc:累加器,和image一樣大小
alpha:更新時,image所佔的權重
mask:操作符掩碼
if mask(x,y)!= 0(1-alpha)*acc(x,y)+alpha*image(x,y) =>acc(x,y)
8.Flip
垂直,水平或即垂直又水平翻轉二維陣列
void cvFlip(const CvArr* src, CvArr* dst=NULL, int flip_mode=0);
src原陣列.dst目標責任制陣列.如果 dst = NULL 翻轉是在內部替換.
flip_mode指定怎樣去翻轉陣列。
flip_mode = 0 沿X-軸翻轉, flip_mode >0 (如 1) 沿Y-軸翻轉, flip_mode < 0 (如 -1) 沿X-軸和Y-軸翻轉.