专栏首页深度学习和计算机视觉【从零学习OpenCV 4】边缘检测原理

【从零学习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;
}

本文分享自微信公众号 - 小白学视觉(NoobCV),作者:小白

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    矩是描述图像特征的算子,被广泛用于图像检索和识别、图像匹配、图像重建、图像压缩以及运动图像序列分析等领域。本节中将介绍几何矩与Hu矩的计算方法以及应用Hu矩实现...

    小白学视觉
  • 图像质量评估:BRISQUE

    我们都知道拍摄相片容易,但是想拍摄高质量的图片却很难,它需要良好的构图和照明。此外,选择正确的镜头和优质的设备也会提高图像的质量。但是,最重要的是,拍摄高质量的...

    小白学视觉
  • 解密深度图像先验,使用深度图像先验来复原图像

    图像恢复是指从退化图像中恢复未知真图像的任务。图像的退化可能发生在图像的形成、传输和存储过程中。这个任务有一个广泛的使用范围,卫星成像,暗光线的摄影,由于数字技...

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

    矩是描述图像特征的算子,被广泛用于图像检索和识别、图像匹配、图像重建、图像压缩以及运动图像序列分析等领域。本节中将介绍几何矩与Hu矩的计算方法以及应用Hu矩实现...

    小白学视觉
  • 机器视觉检测中的图像预处理方法

    本文以Dalsa sherlock软件为例,一起来了解一下视觉检测中平滑模糊的图像处理方法。

    智能算法
  • 总结 | 计算机视觉领域最常见几中损失函数

    损失函数在模型的性能中起着关键作用。选择正确的损失函数可以帮助你的模型学习如何将注意力集中在数据中的正确特征集合上,从而获得最优和更快的收敛。

    OpenCV学堂
  • 移动设备上的多位数字识别

    将纸质文档转换为数字文档有着巨大的需求,因为数字文档更容易检索。经过多年的探索和研究,OCR(Optical Character Recognition,光学字...

    云水木石
  • centos 学习笔记--文件处理命令

    2012-2-4 文件处理命令:cat 命令英文原意: concateate and display files 命令所在路径:/bin/cat 执行权限...

    流川疯
  • 为什么边缘计算是物联网发展的核心?

    目前很多连接的设备能够充分利用云计算的优势,但物联网设备制造商和应用开发人员发现在设备本身进行计算和数据分析将会带来众多的好处。 ? 在设备上进行计算和分析的方...

    SDNLAB
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

    FPGA开源工作室

扫码关注云+社区

领取腾讯云代金券