Canny边缘检测
T2为高阈值,T1为低阈值,推荐的高低阈值比值为 T2: T1 = 3:1/2:1。凡是小于t1的被认为不是边缘要丢弃,大于t2的被认为是边缘被保留,在T1和T2之间的如果与所得到的边缘像素点相邻,则被认为是边缘,否则不是边缘。
API
Canny(
src, sdges,
threshold1, //低阈值
threshold2, //高阈值,常取低阈值的2倍或者3倍
aptertureSzie, //Sobel算子的size
bool L2gradient //选择true表示用L2来归化,选择false表示用L1归化)
L
2
n
o
r
m
=
(
d
I
/
d
x
)
2
+
(
d
I
/
d
y
)
2
L_{2} norm = \sqrt{(dI/dx)^2+(dI/dy)^2}
L2norm=(dI/dx)2+(dI/dy)2
L 1 n o r m = ∣ d I / d x ∣ + ∣ d I / d y ∣ L_{1}norm=|dI/dx|+|dI/dy| L1norm=∣dI/dx∣+∣dI/dy∣
代码展示
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void Canny_demo(int, void*);
int t1value = 50;
int t1max_value = 255;
Mat src, src_blur, blur_gray;
int main()
{
src = imread("F:/Opencvlearn/picture/2.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
GaussianBlur(src, src_blur, Size(3, 3), 0, 0, BORDER_DEFAULT);
cvtColor(src_blur, blur_gray, COLOR_BGR2GRAY);
namedWindow("EdgeImage", WINDOW_AUTOSIZE);
createTrackbar("threshold_value", "EdgeImage", &t1value, t1max_value, Canny_demo);
Canny_demo(0, 0);
waitKey(0);
return 0;
}
void Canny_demo(int , void* )
{
Mat edges;
Canny(blur_gray, edges, t1value, 3 * t1value, 3, false);
Mat dst;
dst.create(src.size(), src.type());//彩色
src.copyTo(dst, edges); //edges为mask
imshow("EdgeImage", edges);
}