zoukankan      html  css  js  c++  java
  • 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 非极大值抑制

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

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

  • 相关阅读:
    spring整合Quartz
    Quartz基本使用
    hibernate框架基础描述
    POI技术实现对excel的导出
    CG-CTF CRYPTO部分wp
    CG-CTF web部分wp
    快速排序算法的c++实现
    tornado当用户输入的URL无效时转入设定的页面
    sicily 4699. 简单哈希
    unbutu下Io language的解释器安装
  • 原文地址:https://www.cnblogs.com/thebreakofdawn/p/9571484.html
Copyright © 2011-2022 走看看