5.1 边缘检测基础
Posted thebreakofdawn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
修改叠加权重,如下:
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 非极大值抑制
图像梯度矩阵中的元素值越大,说明图像中改点的梯度值越大,但这并不能将其判断为改点的边缘。
非极大值抑制操作可以剔除伪边缘信息,原理:通过像素邻域的局部最优值,将非极大值点所对应的灰度值设置为背景像素点。
以上是关于5.1 边缘检测基础的主要内容,如果未能解决你的问题,请参考以下文章
图像边缘检测基于matlab Zernike矩亚像素边缘检测含Matlab源码 1536期