边缘检测(5)Canny算法
邊緣檢測
1、Sobel
2、Laplace
3、Roberts
4、Canny
Canny
canny對邊緣檢測質量進行分析時,有3個原則:
1、信噪比準則
2、定位精度準則
3、單邊緣響應準則 ???????
canny邊緣檢測的基本思想是:首先對圖像選擇一定的Gauss濾波器進行平滑濾波,然后采用非極值抑制技術進行處理得到最后的邊緣圖像。
?
Canny算法基本可分為4個步驟:
步驟一:
濾波平滑噪聲。
GaussianBlur(src,dst,Size(3,3),1.5,1.5);
步驟二:
利用已有的一階偏導算子計算梯度。一般用sobel
步驟三:
非極大值抑制(https://blog.csdn.net/dieju8330/article/details/82789186)
?步驟四:
雙閾值法抑制假邊緣,連接真邊緣?
核心函數:
void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
InputArray類型的image,輸入圖像,即源圖像,填Mat類的對象即可,且需為單通道8位圖像。
OutputArray類型的edges,輸出的邊緣圖,需要和源圖片有一樣的尺寸和類型。
double類型的threshold1,第一個滯后性閾值【低閾值】。值越大,找到的邊緣越少
double類型的threshold2,第二個滯后性閾值【高閾值】。
int類型的apertureSize,表示應用Sobel算子的孔徑大小,其有默認值3。
bool類型的L2gradient,一個計算圖像梯度幅值的標識,有默認值false。
低于閾值1的像素點會被認為不是邊緣;
高于閾值2的像素點會被認為是邊緣;
在閾值1和閾值2之間的像素點,若與第2步得到的邊緣像素點相鄰,則被認為是邊緣,否則被認為不是邊緣。
調用代碼:?
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
?? ?Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
?? ?if (!srcImage.data){
?? ??? ?cout << "falied to read" << endl;
?? ??? ?system("pause");
?? ??? ?return;
?? ?}
?? ?Mat srcGray;
?? ?cvtColor(srcImage, srcGray, CV_BGR2GRAY);
?? ?//高斯濾波
?? ?GaussianBlur(srcGray, srcGray, Size(3, 3),
?? ??? ?0, 0, BORDER_DEFAULT);
?? ?//Canny檢測
?? ?int edgeThresh =100;
?? ?Mat Canny_result;
?? ?Canny(srcImage, Canny_result, edgeThresh, edgeThresh * 3, 3);
?? ?imshow("src", srcImage);
?? ?imshow("Canny_result", Canny_result);
?? ?waitKey(0);
}
實現效果:
原文:https://blog.csdn.net/dieju8330/article/details/82814529?
總結
以上是生活随笔為你收集整理的边缘检测(5)Canny算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看穿面试这件事儿……
- 下一篇: 一阶导数概念