【从零学习OpenCV 4】边缘检测原理

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值的变化趋势可以用函数的导数描述。当函数值突然变大时,导数也必然会变大,而函数值变化较为平缓区域,导数值也比较小,因此可以通过寻找导数值较大的区域去寻找函数中突然变化的区域,进而确定图像中的边缘位置。图5-27给出一张含有边缘的图像,图像每一行的像素灰度值变化可以用图中下方的曲线表示。

图5-27 图像每行像素灰度值变化趋势

通过像素灰度值曲线可以看出图像边缘位于曲线变化最陡峭的区域,对灰度值曲线求取一阶导数可以得到图5-28中所示的曲线,通过曲线可以看出曲线的最大值区域就是图像中的边缘。

图5-28 每一行灰度值函数的导数

由于图像是离散的信号,我们可以用临近的两个像素差值来表示像素灰度值函数的导数,求导形式可以用式(5.12)来表示。

图像的边缘有可能是由高像素值变为低像素值,也有可能是由低像素值变成高像素值,通过式(5.13)和式(5.14)得到的正数值表示需要像素值突然由低变高,得到的负数值表示像素值由高到低,这两种都是图像的边缘,因此为了在图像中同时表示出这两种边缘信息,需要将计算的结果求取绝对值。OpenCV 4中提供了convertScaleAbs()函数用计算矩阵中所有数据的绝对值,该函数的函数原型在代码清单5-22中给出。

代码清单5-22 convertScaleAbs()函数函数原型void cv::convertScaleAbs(InputArray src, OutputArray dst, double alpha = 1, double beta = 0 )
  • src:输入矩阵。
  • dst:计算绝对值后输入矩阵。
  • alpha:缩放因子,默认参数为只求取绝对值不进行缩放。
  • beta:在原始数据上添加的偏值,默认参数表示不增加偏值。

该函数可以求取矩阵中所有数据的绝对值。函数前两个参数分别为输入、输出矩阵,两个参数可以是相同的变量。函数第三个和第四个参数为对绝对值的缩放和原始数据上的偏移。函数的计算原理如式(5.15)所示。

图像的边缘包含X方向的边缘和Y方向的边缘,因此分别求取两个方向的边缘后,对两个方向的边缘求取并集就是整幅图像的边缘,即将图像两个方向边缘结果相加得到整幅图像的边缘信息。为了验证这种滤波方式对于图像边缘提取的效果,在代码清单5-23中给出了利用filter2D()函数实现图像边缘检测的算法,检测的结果在图5-29中给出。需要说明的是,由于求取边缘的结果可能会有复数,不在原始图像的CV_8U的数据类型内,因此滤波后的图像数据类型不要用“-1”,而应该改为CV_16S。代码清单5-23 myEdge.cpp图像边缘检测

代码清单5-23 myEdge.cpp图像边缘检测#include <opencv2\opencv.hpp>#include <iostream>
using namespace cv;using namespace std;
int main(){ //创建边缘检测滤波器 Mat kernel1 = (Mat_<float>(1, 2) << 1, -1); //X方向边缘检测滤波器 Mat kernel2 = (Mat_<float>(1, 3) << 1, 0, -1); //X方向边缘检测滤波器 Mat kernel3 = (Mat_<float>(3, 1) << 1, 0, -1); //X方向边缘检测滤波器 Mat kernelXY = (Mat_<float>(2, 2) << 1, 0, 0, -1); //由左上到右下方向边缘检测滤波器 Mat kernelYX = (Mat_<float>(2, 2) << 0, -1, 1, 0); //由右上到左下方向边缘检测滤波器
//读取图像,黑白图像边缘检测结果较为明显 Mat img = imread("equalLena.png", IMREAD_ANYCOLOR); if (img.empty()) { cout << "请确认图像文件名称是否正确" << endl; return -1; } Mat result1, result2, result3, result4, result5, result6;
//检测图像边缘 //以[1 -1]检测水平方向边缘 filter2D(img, result1, CV_16S, kernel1); convertScaleAbs(result1, result1);
//以[1 0 -1]检测水平方向边缘 filter2D(img, result2, CV_16S, kernel2); convertScaleAbs(result2, result2);
//以[1 0 -1]'检测由垂直方向边缘 filter2D(img, result3, CV_16S, kernel3); convertScaleAbs(result3, result3);
//整幅图像的边缘 result6 = result2 + result3; //检测由左上到右下方向边缘 filter2D(img, result4, CV_16S, kernelXY); convertScaleAbs(result4, result4);
//检测由右上到左下方向边缘 filter2D(img, result5, CV_16S, kernelYX); convertScaleAbs(result5, result5);
//显示边缘检测结果 imshow("result1", result1); imshow("result2", result2); imshow("result3", result3); imshow("result4", result4); imshow("result5", result5); imshow("result6", result6); waitKey(0); return 0;}

图5-29 myEdge.cpp程序中边缘检测结果

(0)

相关推荐

  • 利用边缘检测计算物体面积(内含源码)

    在农业中,通常希望获取不同土地的面积.虽然获取这些土地的面积操作相对容易,但是却涉及高额的费用.另外,如果对于不规则形状的土地,测量土地面积的大小就变得相对困难. 幸运的是,有大量以卫星图像的形式公开 ...

  • python+opencv图像处理(四十一)

    提前过了个万圣节,南瓜灯还蛮好看的,就是那些装鬼的有点吓人...... Scharr算子 1.Scharr算子 Scharr算子也是用于提取图像边缘的. 它是对Sobel算子差异性的增强,两者的原理和 ...

  • 图像分割

    什么是图像分割? (1)图像分割的主要目标是将图像划分为与其中含有真实世界的物体或区域有强相关性的组成部分 (2)分割方法可以归类如下:阈值化.基于边缘.基于区域 (3)每个区域可以用其封闭的边界来表 ...

  • 【博文连载】边缘检测算法介绍

    所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征.边缘存在于目标.背景和区域之间,所以,它是图像分割所依赖的最重要的依据.由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘 ...

  • 【从零学习OpenCV 4】霍夫变换原理及直线检测

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】深度神经网络应用实例

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Mean-Shift分割算法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——分水岭法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】QR二维码检测

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像矩的计算与应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】轮廓外接多边形

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...