opencv入門五,邊緣檢測算法, 霍夫變換直線檢測

Sobel

cv::Sobel (
InputArray Src // 輸入圖像
OutputArray dst// 輸出圖像,大小與輸入圖像一致
int depth // 輸出圖像深度. 
Int dx.  // X方向,幾階導數
int dy // Y方向,幾階導數. 
int ksize, SOBEL算子kernel大小,必須是1357double scale  = 1
double delta = 0
int borderType = BORDER_DEFAULT
)

Scharr

cv::Scharr (
InputArray Src // 輸入圖像
OutputArray dst// 輸出圖像,大小與輸入圖像一致
int depth // 輸出圖像深度. 
Int dx.  // X方向,幾階導數
int dy // Y方向,幾階導數. 
double scale  = 1
double delta = 0
int borderType = BORDER_DEFAULT
)

Laplacian

拉普拉斯提取邊緣流程:(Sobel同理)
高斯模糊 – 去噪聲GaussianBlur()
轉換爲灰度圖像cvtColor()
拉普拉斯 – 二階導數計算Laplacian()
取絕對值convertScaleAbs()
顯示結果

Laplacian(
InputArray src,
OutputArray dst,
int depth, //深度CV_16S
int kisze, // 3
double scale = 1,
double delta =0.0,
int borderType = 4
)

Canny

Canny算法的步驟

  1. 高斯模糊 - GaussianBlur
  2. 灰度轉換 - cvtColor
  3. 計算梯度 – Sobel/Scharr
  4. 非最大信號抑制
  5. 高低閾值輸出二值圖像

Canny算法介紹-高低閾值輸出二值圖像
T1, T2爲閾值,凡是高於T2的都保留,凡是小於T1都丟棄,從高於T2的像素出發,凡是大於T1而且相互連接的,都保留。最終得到一個輸出二值圖像。
推薦的高低閾值比值爲 T2: T1 = 3:1/2:1其中T2爲高閾值,T1爲低閾值

Canny(
InputArray src, // 8-bit的輸入圖像
OutputArray edges,// 輸出邊緣圖像, 一般都是二值圖像,背景是黑色
double threshold1,// 低閾值,常取高閾值的1/2或者1/3
double threshold2,// 高閾值
int aptertureSize,// Soble算子的size,通常3x3,取值3
bool L2gradient // 選擇 true表示是L2來歸一化,否則用L1歸一化

src.copyTo(dst, mask);
mask像素不爲0的區域拷貝到dst, 像素爲0的區域不拷貝。
應用:將提取的邊緣做爲mask, 拷貝到原圖中,可以得到彩色的邊緣圖像。

霍夫變換

標準的霍夫變換 cv::HoughLines從平面座標轉換到霍夫空間,
霍夫變換直線概率 cv::HoughLinesP最終輸出是直線的兩個點
檢測前提:邊緣檢測

cv::HoughLines(
InputArray src, // 輸入圖像,必須8-bit的灰度圖像
OutputArray lines, // 輸出的極座標來表示直線
double rho, // 生成極座標時候的像素掃描步長
double theta, //生成極座標時候的角度步長,一般取值CV_PI/180
int threshold, // 閾值,只有獲得足夠交點的極座標點才被看成是直線
double srn=0;// 是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double stn=0;//是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double min_theta=0; // 表示角度掃描範圍 0 ~180之間, 默認即可
double max_theta=CV_PI
) // 一般情況是有經驗的開發者使用,需要自己反變換到平面空間
cv::HoughLinesP(
InputArray src, // 輸入圖像,必須8-bit的灰度圖像
OutputArray lines, // 輸出的極座標來表示直線(可以Vector<Vec4f> plines 來存儲點)
double rho, // 生成極座標時候的像素掃描步長
double theta, //生成極座標時候的角度步長,一般取值CV_PI/180
int threshold, // 閾值,只有獲得足夠交點的極座標點才被看成是直線
double minLineLength=0;// 最小直線長度
double maxLineGap=0;// 最大間隔
)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章