卷积应用-图像边缘提取
卷积应用-图像边缘提取
边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一,
在图像特征提取、对象检测、模式识别等方面都有重要的作用。
如何捕捉/提取边缘 – 对图像求它的一阶导数
- delta = f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强
Sobel算子
是离散微分算子(discrete differentiation operator),
用来计算图像灰度的近似梯度Soble算子功能集合高斯平滑和微分求导
又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像X方法与Y方向梯度图像
1 cv::Sobel (
2 InputArray Src // 输入图像
3 OutputArray dst // 输出图像,大小与输入图像一致
4 int depth // 输出图像深度.
5 Int dx // X方向,几阶导数
6 int dy // Y方向,几阶导数.
7 int ksize // SOBEL算子kernel大小,必须是1、3、5、7、
8 double scale = 1
9 double delta = 0
10 int borderType = BORDER_DEFAULT
11 )
1 cv::Scharr (
2 InputArray Src // 输入图像
3 OutputArray dst // 输出图像,大小与输入图像一致
4 int depth // 输出图像深度
5 Int dx. // X方向,几阶导数
6 int dy // Y方向,几阶导数
7 double scale = 1
8 double delta = 0
9 int borderType = BORDER_DEFAULT
10 )
1 其他API
2 GaussianBlur( src, dst, Size(3,3), 0, 0, BORDER_DEFAULT );
3 cvtColor( src, gray, COLOR_RGB2GRAY );
4 addWeighted( A, 0.5,B, 0.5, 0, AB);
5 convertScaleAbs(A, B)// 计算图像A的像素绝对值,输出到图像B
1 int main(int argc, char** argv) {
2 Mat src, dst;
3 src = imread(STRPAHT2);
4 if (!src.data) {
5 printf("could not load image...\n");
6 return -1;
7 }
8
9 Mat gray_src;
10 GaussianBlur(src, dst, Size(3, 3), 0, 0, BORDER_DEFAULT);
11 cvtColor(dst, gray_src, CV_BGR2GRAY);
12 //imshow("gray image", gray_src);
13
14 Mat xgrad, ygrad;
15
16 //Scharr(gray_src, xgrad, CV_16S, 1, 0, 3);
17 //Scharr(gray_src, ygrad, CV_16S, 0, 1, 3);
18 //convertScaleAbs(xgrad, xgrad);
19 //convertScaleAbs(ygrad, ygrad);
20 //imshow("xgrad", xgrad);
21 //imshow("ygrad", ygrad);
22
23 Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
24 Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
25 convertScaleAbs(xgrad, xgrad);
26 convertScaleAbs(ygrad, ygrad);
27 imshow("xgrad", xgrad);
28 imshow("ygrad", ygrad);
29
30 waitKey(0);
31 return 0;
32 }