OpenCV幾種邊緣檢測的簡例


簡單記錄一下OpenCV的幾種邊緣檢測函數的用法。

邊緣檢測算法
  以Sobel邊緣檢測算法為例。
  Sobel卷積核模板為:

偏導公式為:

Gx(i,j)=[f(i+1,j1)+2f(i+1,j)+f(i+1,j+1)][f(i1,j1)+2f(i1,j)+f(i1,j+1)]

Gy(i,j)=[f(i1,j+1)+2f(i,j+1)+f(i+1,j+1)][f(i1,j1)+2f(i,j1)+f(i+1,j1)]

  卷積核模板的圖片又是從網上抄來的,實際上我都不是很確定 Gx,Gy 有沒有標反,但這不重要,只要知道了卷積核,就可以把核放到矩陣上一個一個的滑動,對應位置相乘,然后把這6(其實應該說是9個數,因為在Sobel算子的卷積核中有3個0,任何數乘以0都是0,所以可以不計算,但在其他算子就不見得都為0)個乘積相加,就分別得到了該坐標位置的 Gx,Gy ,這樣一直滑到最后一個(我就是這么理解卷積的)。
  不過到這里其實還只是做了一半,因為還只是算出來了 x y 方向的偏導數。

  公式(8.1)是梯度向量,梯度幅值為用公式(8.2)。但在實際使用中,為了提高計算的速度,我們可以用式(8.3)、(8.4)(8.5)來近似。(8.6)是梯度向量的方向角公式。
  所以,在計算出(i,j)處的 Gx(i,j),Gy(i,j) 之后,可以用式(8.2)計算出圖像的梯度幅值,或者用式(8.3)、(8.4)、(8.5)算出近似幅值后,設定一個閾值T,如果 (i,j) 處的幅值大於閾值T,則認為該點是邊緣點。
  邊緣檢測大體都是這樣,不同的算子只是卷積核不同。其實只要理解了圖像數據是怎么進行卷積計算的,都可以自己設計算子,當然效果要好才有用。

附上一個OpenCV的幾個邊緣檢測函數的簡單使用的栗子。

#include "stdafx.h"

#include "cv.h"
#include "highgui.h"

using namespace cv;

int main(int argc, char* argv[])
{
    Mat src = imread("F:\\picture\\cv53.jpg");
    Mat dst;

    //輸入圖像
    //輸出圖像
    //輸入圖像顏色通道數
    //x方向階數
    //y方向階數
    //Sobel(src,dst,src.depth(),1,1);
    //imwrite("sobel.jpg",dst);

    //輸入圖像
    //輸出圖像
    //輸入圖像顏色通道數
    //Laplacian(src,dst,src.depth());
    //imwrite("laplacian.jpg",dst);

    //輸入圖像
    //輸出圖像
    //彩色轉灰度
    cvtColor(src,src,CV_BGR2GRAY);  //canny只處理灰度圖

    //輸入圖像
    //輸出圖像
    //低閾值
    //高閾值,opencv建議是低閾值的3倍
    //內部sobel濾波器大小
    Canny(src,dst,50,150,3);    
    imwrite("canny71.jpg",dst);

    imshow("dst",dst);
    waitKey();

    return 0;
}

  想測試那種邊緣檢測,就把注釋修改一下即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM