OpenCV-C++ Canny算法介绍
目錄Canny理論原理過濾噪聲計(jì)算圖像梯度非最大值抑制算子(NMS)雙閾值算法檢測邊緣和連接邊緣OpenCV Canny使用
注意:文章原理還很不完善,僅供本人學(xué)習(xí)使用;
Canny理論原理
Canny邊緣檢測器是由John F. Canny在1986年提出,Canny被稱為最優(yōu)檢測器,其目標(biāo)滿足以下三個主要標(biāo)準(zhǔn):
低錯誤率:對已有的邊界能夠有很好的檢測;
良好的定位:即檢測到的邊緣像素和實(shí)際邊緣像素之間的距離必須最小化;
最小響應(yīng):即每邊只有一個響應(yīng);
Canny算法主要包含以下五個步驟:
過濾噪聲
使用高斯濾波器去噪,高斯核如下圖所示:
計(jì)算圖像梯度
首先,在圖像利用Sobel算子計(jì)算x, y兩個方向的梯度:
其次,計(jì)算梯度的強(qiáng)度和方向:
其中,梯度的方向被四舍五入到[0, 45, 90, 135]這幾個角度;
非最大值抑制算子(NMS)
抑制那些梯度不夠大的像素點(diǎn),只保留最大的像素點(diǎn),從而達(dá)到瘦邊的目的;
雙閾值算法檢測邊緣和連接邊緣
經(jīng)過NMS算法后,設(shè)置兩個閾值(T_1, T_2),通常(T_1)是(T_2)的(1/2)或者(1/3);
梯度值大于(T_2)的像素點(diǎn)稱為強(qiáng)邊緣,保留作為圖像邊緣;
梯度值小于(T_1)的像素點(diǎn)不是邊緣,舍棄;
針對梯度值大于(T_1),小于(T_2)的像素點(diǎn),稱為弱邊緣;
針對弱邊緣,需要進(jìn)一步判定其是否的真正的邊緣像素點(diǎn);判別的方法就是,當(dāng)弱邊緣像素點(diǎn)周圍8個領(lǐng)域內(nèi)存在強(qiáng)邊緣像素時,則該弱邊緣變成強(qiáng)邊緣點(diǎn),否則不是邊緣點(diǎn);
OpenCV Canny使用
CannyAPI的介紹:
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );
src輸入圖像,必須是8-bits;
edges輸出的圖像邊緣
threshold1, threshold2對應(yīng)于上述的(T_1, T_2);
apertureSize是Sobel算子的大小;
L2gradient表示計(jì)算梯度值時是否使用(L2)(就是默認(rèn)的計(jì)算方式);
如果設(shè)置L2gradient=True,則梯度值的計(jì)算方式為:
[G = |G_x| + |G_y|
]
使用方式:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
/**
* 邊緣處理
*/
Mat src, srcBlur, srcGray;
const int MAX_THRESHOLD = 255;
int t1_value = 50;
char output_wind[] = "output";
void Canny_Demo(int, void*);
int main(){
// 讀取圖像
src = imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
cout << "could not load image." << endl;
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
GaussianBlur(src, srcBlur, Size(3, 3), 0, 0);
cvtColor(srcBlur, srcGray, COLOR_BGR2GRAY);
namedWindow(output_wind, WINDOW_AUTOSIZE);
createTrackbar("Threshold: ", output_wind, &t1_value, MAX_THRESHOLD, Canny_Demo);
Canny_Demo(0, 0);
waitKey(0);
return 0;
}
void Canny_Demo(int, void*){
Mat edgeOutput;
Canny(srcGray, edgeOutput, t1_value, t1_value*2, 3, false);
imshow(output_wind, edgeOutput);
}
Reference:
學(xué)習(xí)筆記-canny邊緣檢測
總結(jié)
以上是生活随笔為你收集整理的OpenCV-C++ Canny算法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钉钉产品介绍_钉钉上线安全教育新功能家校
- 下一篇: Qt QUndoStack、QUndoC