1. 程式人生 > >Opencv學習(三)——影象變換

Opencv學習(三)——影象變換

一、邊緣檢測

邊緣檢測的一般步驟:

  1. 濾波——消除噪聲
  2. 增強——使邊界輪廓更加明顯
  3. 檢測——選出邊緣點

1.1、canny運算元

void Canny(

inputArray,

outputArray,

double threshold1,

double threshold2,

int apertureSize=3,

bool L2gradient=false

) ;

  • 第一個引數,輸入影象,且需為單通道8點陣圖像。
  • 第二個引數,輸出的邊緣圖。
  • 第三個引數,第一個滯後性閾值。用於邊緣連線。
  • 第四個引數,第二個滯後性閾值。用於控制強邊緣的初始段,高低閾值比在2:1到3:1之間。
  • 第五個引數,表明應用sobel運算元的孔徑大小,預設值為3。
  • 第六個引數,bool型別L2gradient,一個計算影象梯度幅值的標識,預設值false。

1.2、sobel運算元

void Sobel(

inputArray,

outputArray,

int ddepth,

int dx,

int dy,

int ksize=3,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一個引數,輸入影象。
  • 第二個引數,輸出影象。
  • 第三個引數,輸出影象深度。
  • 第四個引數,x方向上的差分階數。
  • 第五個引數,y方向上的差分階數。
  • 第六個引數,Sobel核的大小,預設值為3,必須為1、3、5、7。當為1時,往往使用3x1、1x3的核心,這種情況下,沒有進行高斯平滑操作。
  • 第七個引數,計算導數值時可選的縮放因子,預設值1,表示預設情況下沒用應用縮放。
  • 第八個引數,表示在結果存入輸出影象之前可選的delta值,預設值0。
  • 第九個引數,邊界模式。

1.3、Laplacian運算元

void Laplacian(

inputArray,

outputArray,

int ddepth,

int ksize=1,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一個引數,輸入影象,且需為單通道8點陣圖像。
  • 第二個引數,輸出的邊緣圖。
  • 第三個引數,輸出影象的影象深度。
  • 第四個引數,用於計算二階導數的濾波器的孔徑尺寸大小,大小必須為正奇數,預設值為1。
  • 第五個引數,計算拉普拉斯值的時候可選的比例因子,預設值為1。
  • 第六個引數,表示在結果存入目標圖之前可選的delta值,預設值為0。
  • 第七個引數,邊界模式。

1.4、scharr濾波器

void Scharr(

inputArray,

outputArray,

int ddepth,

int dx,

int dy,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一個引數,輸入影象。
  • 第二個引數,輸出影象。
  • 第三個引數,輸出影象深度。
  • 第四個引數,x方向上的差分階數。
  • 第五個引數,y方向上的差分階數。
  • 第六個引數,計算導數值時可選的縮放因子,預設值1,表示預設情況下沒用應用縮放。
  • 第七個引數,表示在結果存入輸出影象之前可選的delta值,預設值0。
  • 第八個引數,邊界模式

二、霍夫變換

霍夫線變換是一種用來尋找直線的方法. 在使用霍夫線變換之前, 首先要對影象進行邊緣檢測的處理,也即霍夫線變換的直接輸入只能是邊緣二值影象。由HoughLines函式呼叫。

多尺度霍夫變換為經典霍夫變換在多尺度下的一個變種。由HoughLines函式呼叫。

累計概率霍夫變換演算法是標準霍夫變換演算法的一個改進,它在一定的範圍內進行霍夫變換,計算單獨線段的方向以及範圍,從而減少計算量,縮短計算時間。由HoughLinesP函式呼叫。

void HoughLines(

InputArray image,

OutputArray lines,

double rho,

double theta,

int threshold,

double srn=0,

double stn=0

) ;

  • 第一個引數,InputArray型別的image,輸入影象,即源影象,需為8位的單通道二進位制影象,可以將任意的源圖載入進來後由函式修改成此格式後,再填在這裡。
  • 第二個引數,InputArray型別的lines,經過呼叫HoughLines函式後儲存了霍夫線變換檢測到線條的輸出向量。每一條線由具有兩個元素的矢量表示,其中,是離座標原點((0,0)(也就是影象的左上角)的距離。 是弧度線條旋轉角度(0垂直線,π/2水平線)。
  • 第三個引數,double型別的rho,以畫素為單位的距離精度。另一種形容方式是直線搜尋時的進步尺寸的單位半徑。PS:Latex中/rho就表示 。
  • 第四個引數,double型別的theta,以弧度為單位的角度精度。另一種形容方式是直線搜尋時的進步尺寸的單位角度。
  • 第五個引數,int型別的threshold,累加平面的閾值引數,即識別某部分為圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段才可以被檢測通過並返回到結果中。
  • 第六個引數,double型別的srn,有預設值0。對於多尺度的霍夫變換,這是第三個引數進步尺寸rho的除數距離。粗略的累加器進步尺寸直接是第三個引數rho,而精確的累加器進步尺寸為rho/srn。
  • 第七個引數,double型別的stn,有預設值0,對於多尺度霍夫變換,srn表示第四個引數進步尺寸的單位角度theta的除數距離。且如果srn和stn同時為0,就表示使用經典的霍夫變換。否則,這兩個引數應該都為正數。

void HoughLinesP(

InputArray image,

OutputArray lines,

double rho,

double theta,

int threshold,

double minLineLength=0,

double maxLineGap=0

) ;

  • 第一個引數,InputArray型別的image,輸入影象,即源影象,需為8位的單通道二進位制影象,可以將任意的源圖載入進來後由函式修改成此格式後,再填在這裡。
  • 第二個引數,InputArray型別的lines,經過呼叫HoughLinesP函式後後儲存了檢測到的線條的輸出向量,每一條線由具有四個元素的向量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每個檢測到的線段的結束點。
  • 第三個引數,double型別的rho,以畫素為單位的距離精度。另一種形容方式是直線搜尋時的進步尺寸的單位半徑。
  • 第四個引數,double型別的theta,以弧度為單位的角度精度。另一種形容方式是直線搜尋時的進步尺寸的單位角度。
  • 第五個引數,int型別的threshold,累加平面的閾值引數,即識別某部分為圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段才可以被檢測通過並返回到結果中。
  • 第六個引數,double型別的minLineLength,有預設值0,表示最低線段的長度,比這個設定引數短的線段就不能被顯現出來。
  • 第七個引數,double型別的maxLineGap,有預設值0,允許將同一行點與點之間連線起來的最大的距離。

三、重對映

把一個影象中一個位置的畫素放置到另一個圖片指定位置的過程。

簡單的說就是改變圖片的位置(左,右,上,下,顛倒)

void remap(

InputArray src,

OutputArraydst,

InputArray map1,

InputArray map2,

int interpolation,

intborderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar()

);

  • 第一個引數,InputArray型別的src,輸入影象,即源影象,填Mat類的物件即可,且需為單通道8位或者浮點型影象。
  • 第二個引數,OutputArray型別的dst,函式呼叫後的運算結果存在這裡,即這個引數用於存放函式呼叫後的輸出結果,需和源圖片有一樣的尺寸和型別。
  • 第三個引數,InputArray型別的map1,它有兩種可能的表示物件
  • 第四個引數,InputArray型別的map2,同樣,它也有兩種可能的表示物件,根據map1來確定表示哪種物件。
  • 第五個引數,int型別的interpolation,插值方式,之前的resize( )函式中有講到,需要注意,resize( )函式中提到的INTER_AREA插值方式在這裡是不支援的,所以可選的插值方式如下:

INTER_NEAREST - 最近鄰插值 INTER_LINEAR – 雙線性插值(預設值) INTER_CUBIC – 雙三次樣條插值(逾4×4畫素鄰域內的雙三次插值) INTER_LANCZOS4 -Lanczos插值(逾8×8畫素鄰域的Lanczos插值)

  • 第六個引數,int型別的borderMode,邊界模式,有預設值BORDER_CONSTANT,表示目標影象中“離群點(outliers)”的畫素值不會被此函式修改。
  • 第七個引數,const Scalar&型別的borderValue,當有常數邊界時使用的值,其有預設值Scalar( ),即預設值為0

四、仿射變換

仿射變換(Affine Transformation)是空間直角座標系的變換,從一個二維座標變換到另一個二維座標,仿射變換是一個線性變換,他保持了影象的“平行性”和“平直性”,即影象中原來的直線和平行線,變換後仍然保持原來的直線和平行線,仿射變換比較常用的特殊變換有平移(Translation)、縮放(Scale)、翻轉(Flip)、旋轉(Rotation)和剪下(Shear)。

void warpAffine(

InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags=INTER_LINEAR,

intborderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar()

) ;

  • 第一個引數,InputArray型別的src,輸入影象,即源影象,填Mat類的物件即可。
  • 第二個引數,OutputArray型別的dst,函式呼叫後的運算結果存在這裡,需和源圖片有一樣的尺寸和型別。
  • 第三個引數,InputArray型別的M,2×3的變換矩陣。
  • 第四個引數,Size型別的dsize,表示輸出影象的尺寸。
  • 第五個引數,int型別的flags,插值方法的識別符號。此引數有預設值INTER_LINEAR(線性插值),可選的插值方式如下:

INTER_NEAREST - 最近鄰插值 INTER_LINEAR - 線性插值(預設值) INTER_AREA - 區域插值 INTER_CUBIC –三次樣條插值 INTER_LANCZOS4 -Lanczos插值 CV_WARP_FILL_OUTLIERS - 填充所有輸出影象的象素。如果部分象素落在輸入影象的邊界外,那麼它們的值設定為 fillval. CV_WARP_INVERSE_MAP –表示M為輸出影象到輸入影象的反變換,即 。因此可以直接用來做象素插值。否則, warpAffine函式從M矩陣得到反變換。

  • 第六個引數,int型別的borderMode,邊界畫素模式,預設值為BORDER_CONSTANT。
  • 第七個引數,const Scalar&型別的borderValue,在恆定的邊界情況下取的值,預設值為Scalar(),即0。

五、直方圖均衡化

直方圖均衡化是通過調整影象的灰階分佈,使得在0~255灰階上的分佈更加均衡,提高了影象的對比度,達到改善影象主觀視覺效果的目的。對比度較低的影象適合使用直方圖均衡化方法來增強影象細節。

void equalizeHist(

InputArray src,

OutputArray dst

);

  • 第一個引數:Mat即可,需要8位單通道的影象
  • 第二個引數:需要與原圖片相同尺寸