边缘检测的一般步骤:
1 滤波 通常为一阶/二阶导数
2 增强
3 检测 通常有多个元素的梯度点较大,用阈值来筛选
边缘检测的3个评价标准:
1 错误率低
2 定位性高
3 最小响应:图像中的边缘只能标识一次
Canny边缘检测函数:Canny
void Canny(InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false)
参数1 image:输入图像,单通道8位图像
参数2 edges:输出边缘
参数3 threshold1:滞后阈值1
参数4 threshold2:滞后阈值2
参数5 apertureSize:应用的Sobel算子孔径大小
参数6 L2gradient:计算图像梯度幅值标识
例:
Mat src = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat dst = src.clone();
Canny(src, dst, 150, 100, 3);
imshow("win",dst);
sobel算子:sobel
void sobel(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1;
double delta = 0;
int borderType = BORDER_DEFAULT)
参数3 ddepth:输出图像的深度,=-1,同src.depth()
输出深度>=src.depth()
参数4 dx:x方向上的差分阶数
参数5 dy:y方向上的差分阶数
参数6 ksize:sobel核大小
参数7 scale:计算导数时可选的缩放因子
参数8 delta:存入dst之前可选的delta
参数9 borderType:边界模式
例:
Mat src = imread("1.jpg");
Mat dst;
Sobel(src,dst, CV_8U, 1, 1);
scharr滤波器:scharr
注意:由于sobel在3*3内核中误差较大,
所以有一个固定3*3内核的函数Scharr
void Scharr(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale=1,
double delta=0,
int borderType=BORDER_DEFAULT );
Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType)
等价于
Sobel(src,dst,ddepth,dx,dy,CV_SCHARR,scale,delta,borderType)
其中:
/* Special filters */
enum
{
CV_SCHARR =-1,
CV_MAX_SOBEL_KSIZE =7
};
例:
Mat src = imread("1.jpg");
Mat dst;
Scharr(src,dst, CV_8U, 1, 1);
Laplacian算子:Laplacian
void Laplacian( InputArray src,
OutputArray dst,
int ddepth,
int ksize=1,
double scale=1,
double delta=0,
int borderType=BORDER_DEFAULT );
参数3 ksize:当=1时,采用以下3*3孔径
0 1 0
1 -4 1
0 1 0
例:
Mat src = imread("1.jpg");
Mat dst;
1 滤波 通常为一阶/二阶导数
2 增强
3 检测 通常有多个元素的梯度点较大,用阈值来筛选
边缘检测的3个评价标准:
1 错误率低
2 定位性高
3 最小响应:图像中的边缘只能标识一次
Canny边缘检测函数:Canny
void Canny(InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false)
参数1 image:输入图像,单通道8位图像
参数2 edges:输出边缘
参数3 threshold1:滞后阈值1
参数4 threshold2:滞后阈值2
参数5 apertureSize:应用的Sobel算子孔径大小
参数6 L2gradient:计算图像梯度幅值标识
例:
Mat src = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat dst = src.clone();
Canny(src, dst, 150, 100, 3);
imshow("win",dst);
sobel算子:sobel
void sobel(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1;
double delta = 0;
int borderType = BORDER_DEFAULT)
参数3 ddepth:输出图像的深度,=-1,同src.depth()
输出深度>=src.depth()
参数4 dx:x方向上的差分阶数
参数5 dy:y方向上的差分阶数
参数6 ksize:sobel核大小
参数7 scale:计算导数时可选的缩放因子
参数8 delta:存入dst之前可选的delta
参数9 borderType:边界模式
例:
Mat src = imread("1.jpg");
Mat dst;
Sobel(src,dst, CV_8U, 1, 1);
scharr滤波器:scharr
注意:由于sobel在3*3内核中误差较大,
所以有一个固定3*3内核的函数Scharr
void Scharr(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale=1,
double delta=0,
int borderType=BORDER_DEFAULT );
Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType)
等价于
Sobel(src,dst,ddepth,dx,dy,CV_SCHARR,scale,delta,borderType)
其中:
/* Special filters */
enum
{
CV_SCHARR =-1,
CV_MAX_SOBEL_KSIZE =7
};
例:
Mat src = imread("1.jpg");
Mat dst;
Scharr(src,dst, CV_8U, 1, 1);
Laplacian算子:Laplacian
void Laplacian( InputArray src,
OutputArray dst,
int ddepth,
int ksize=1,
double scale=1,
double delta=0,
int borderType=BORDER_DEFAULT );
参数3 ksize:当=1时,采用以下3*3孔径
0 1 0
1 -4 1
0 1 0
例:
Mat src = imread("1.jpg");
Mat dst;
Laplacian(src, dst, CV_8U, 5);