圖像金字塔:
高斯金字塔 – 用來對圖像進行降採樣
拉普拉斯金字塔 – 用來重建一張圖片根據它的上層降採樣圖片
高斯金字塔是從底向上,逐層降採樣得到。
降採樣之後圖像大小是原圖像MxN的M/2 x N/2 ,就是對原圖像刪除偶數行與列,即得到降採樣之後上一層的圖片。
高斯金子塔的生成過程分爲兩步:
- 對當前層進行高斯模糊
- 刪除當前層的偶數行與列
即可得到上一層的圖像,這樣上一層跟下一層相比,都只有它的1/4大小。
上採樣與降採樣
上採樣,生成圖像是原圖在寬高各放大兩倍
pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2));
降採樣,生成圖像是原圖在寬高各縮小1/2
pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2));
高斯差分
Difference of Gaussian(DOG)是高斯函數的差分。將兩幅圖像在不同參數下的高斯濾波結果相減,得到DoG圖。步驟:
處理一幅圖像在不同高斯參數下的DoG
用兩個不同的5x5高斯覈對圖像進行卷積,然後再相減的操作。重複三次得到三個差分圖A,B,C。
根據DoG求角點
計算出的A,B,C三個DOG圖中求圖B中是極值的點。圖B的點在當前由A,B,C共27個點組成的block中是否爲極大值或者極小值。若滿足此條件則認爲是角點。
Mat gray, g1, g2;
cvtColor(src, gray, CV_BGR2GRAY);
GaussianBlur(gray, g1, Size(3, 3), 0, 0);
GaussianBlur(g1, g2, Size(3, 3), 0, 0);
subtract(g1, g2, dst, Mat());
歸一化函數
void normalize(InputArray src,OutputArraydst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, InputArray mask = noArray() )
參數說明:
src——輸入數組
dst——輸出數組,支持原地運算
alpha——range normalization模式的最小值
beta ——range normalization模式的最大值,不用於norm normalization(範數歸一化)模式。
normType——歸一化的類型,可以有以下的取值:
NORM_MINMAX:數組的數值被平移或縮放到一個指定的範圍,線性歸一化,一般較常用。
NORM_INF:此類型的定義沒有查到,根據OpenCV 1的對應項,可能是歸一化數組的C-範數(絕對值的最大值)
NORM_L1 : 歸一化數組的L1-範數(絕對值的和)
NORM_L2: 歸一化數組的(歐幾里德)L2-範數
dtype——dtype爲負數時,輸出數組的type與輸入數組的type相同;否則,輸出數組與輸入數組只是通道數相同,而tpye=CV_MAT_DEPTH(dtype).
mask
操作掩膜,用於指示函數是否僅僅對指定的元素進行操作。
threshold(gray, dst, threshold_value, threshold_max, type_value);
邊緣填充
在卷積開始之前增加邊緣像素,填充的像素值爲0或者RGB黑色,比如3x3在
四周各填充1個像素的邊緣,這樣就確保圖像的邊緣被處理,在卷積處理之
後再去掉這些邊緣。openCV中默認的處理方法是: BORDER_DEFAULT,此外
常用的還有如下幾種:
- BORDER_CONSTANT – 填充邊緣用指定像素值
- BORDER_REPLICATE – 填充邊緣像素用已知的邊緣像素值。
- BORDER_WRAP – 用另外一邊的像素來補償填充
給圖像添加邊緣API
copyMakeBorder(
- Mat src, // 輸入圖像
- Mat dst, // 添加邊緣圖像
- int top, // 邊緣長度,一般上下左右都取相同值,
- int bottom,
- int left,
- int right,
- int borderType // 邊緣類型
- Scalar value
)
參考文獻:51CTO學院講義