opencv入門四:圖像金字塔,高斯差分,歸一化函數,邊緣填充

圖像金字塔:

高斯金字塔 – 用來對圖像進行降採樣
拉普拉斯金字塔 – 用來重建一張圖片根據它的上層降採樣圖片

高斯金字塔是從底向上,逐層降採樣得到。
降採樣之後圖像大小是原圖像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學院講義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章