5.1 边缘检测基础

5.1.1边缘检测:找出图像中亮度(灰度?)变化剧烈的像素点构成的集合。

结构属性

有哪些边缘检测类型:一阶微分为基础(Sobel算子等)、二阶微分为基础(拉普拉斯算子、高斯拉普拉斯算子、Canny算子边缘检测等),混合两者为基础。

5.1.2梯度算子:数字图像—>差分代替微分运算。定义图像的梯度为梯度算子。图像梯度最重要的性质是梯度的方向是在图像灰度变化最大率上,恰好反应出图像边缘上的灰度变化。

5.1.3一阶微分算子,利用图像在边缘处阶跃性,即图像梯度在边缘处取得极大值的特性来进行边缘检测。对于一幅二维数字图像需要完成x和y两个方向微分。得到梯度是一个矢量:具有模和方向,梯度方向提供了边缘的趋势信息,梯度方向始终与边缘方向正交,梯度的模值大小提供了边缘的强度信息。

5.1.4二阶微分算子

5.1.5图像差分运算

 1 //////////////////////////////////5.1.5图像差分运算//////////////////////////////////////////
 2 //////https://blog.csdn.net/gone_huilin/article/details/53223575
 3 
 4 #include <opencv2/core/core.hpp>
 5 #include <opencv2/highgui/highgui.hpp>
 6 #include <opencv2/opencv.hpp>
 7 
 8 using namespace cv;
 9 
10 // 图像差分操作
11 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,
12     cv::Mat& edgeYImage)
13 {
14     cv::Mat tempImage = srcImage.clone();
15     int nRows = tempImage.rows;
16     int nCols = tempImage.cols;
17     for (int i = 0; i < nRows - 1; i++)
18     {
19         for (int j = 0; j < nCols - 1; j++)
20         {
21             // 计算垂直边边缘
22             edgeXImage.at<uchar>(i, j) =
23                 abs(tempImage.at<uchar>(i + 1, j) -
24                     tempImage.at<uchar>(i, j));
25             // 计算水平边缘
26             edgeYImage.at<uchar>(i, j) =
27                 abs(tempImage.at<uchar>(i, j + 1) -
28                     tempImage.at<uchar>(i, j));
29         }
30     }
31 }
32 
33 int main()
34 {
35     cv::Mat srcImage = cv::imread("D:\\楼房.jpg");
36     if (!srcImage.data)
37         return -1;
38     cv::imshow("srcImage", srcImage);
39     cv::cvtColor(srcImage, srcImage, CV_BGR2GRAY);
40     cv::imshow("srcImage", srcImage);
41     cv::Mat edgeXImage(srcImage.size(), srcImage.type());
42     cv::Mat edgeYImage(srcImage.size(), srcImage.type());
43     // 计算查分图像
44     diffOperation(srcImage, edgeXImage, edgeYImage);
45     cv::imshow("edgeXImage", edgeXImage);
46     cv::imshow("edgeYImage", edgeYImage);
47     cv::Mat edgeImage(srcImage.size(), srcImage.type());
48     // 水平与垂直边缘图像叠加
49     addWeighted(edgeXImage, 0.5, edgeYImage,
50         0.5, 0.0, edgeImage);
51     cv::imshow("edgeImage", edgeImage);
52     cv::waitKey(0);
53     return 0;
54 }
View Code

修改叠加权重,如下:

addWeighted(edgeXImage, 10, edgeYImage, 10, 0.0, edgeImage);

参考:

https://blog.csdn.net/gone_huilin/article/details/53223575

https://blog.csdn.net/qq_31531635/article/details/73382603 

https://blog.csdn.net/gone_huilin/article/details/53223575 

5.1.6 非极大值抑制

图像梯度矩阵中的元素值越大,说明图像中改点的梯度值越大,但这并不能将其判断为改点的边缘。

非极大值抑制操作可以剔除伪边缘信息,原理:通过像素邻域的局部最优值,将非极大值点所对应的灰度值设置为背景像素点。

 

posted @ 2018-09-01 20:24  BreakofDawn  阅读(336)  评论(0编辑  收藏  举报