opencv 学习笔记六 边缘检测

在进行图像识别时,常需要检测图像的边缘信息。即边缘灰度值急剧变化的地方,一般是北京和前景物体的交界处。由于边缘处的灰度值急剧变化特性,可以利用离散数列的差分(相当于连续函数的导数)来识别边缘。目前常用的边缘检测算法大多数是通过梯度方向导数求卷积的方法,常用的卷积算子有

常用卷积算子:Roberts算子、Prewitt算子、Sobel算子、Scharr算子、canny边缘检测算法

非常用卷积算子:Laplacian算子、高斯拉普拉斯(LOG)边缘检测、高斯差分(DOG)边缘检测

1、Roberts算子

Roberts边缘检测算法:图像分别与下面两个卷积核进行卷积运算。第一个为135°方向像素差分,第二个为45°方向像素值差分,卷积后,图像内部相近的像素值为变为0,即黑色北京,二边缘由于像素值相差打,相减的差分值作为新的像素值。因此能够将图像边缘处的像素值识别出来,活得图像边缘轮廓;

opencv 学习笔记六 边缘检测

通过上述两个卷积会得到145°和45°的卷积结果,将两者合并得到最后的输出结果。有如下四种合并方式:

a.取两个矩阵相对位置的绝对值的和;

b.取两个矩阵对应位置的平方和的开方;

c.取两个矩阵对应位置绝对值的最大值;

d.插值法;

以上4中方法,b方案为效果最优方案,但同时也是最耗时的方案;

2、Canny边缘检测算法

Sobel,Scharr算子等边缘检测算法,只是对检测到的边缘进行了超阈值处理(超过255的像素点截断等), Canny边缘算法,是在sobel算法的基础上,对边缘像素进行更细致的后处理,过滤掉部分非边缘点,从而使得到便边缘更加细致准确。

Canny边缘检测可以细分为三步:

  • 采用Sobel卷积核进行卷积运算
  • 基于边缘梯度方向的非极大值抑制
  • 双阈值的滞后阈值处理

(1) Sobel卷积核进行卷积运算

opencv 学习笔记六 边缘检测

opencv 学习笔记六 边缘检测

(2) 基于边缘梯度方向的非极大值抑制

在得到每个像素的梯度大小和方向后,我们遍历每个像素,判断该像素的梯度大小在该像素梯度方向上是否是其邻域中的局部最大值。如下图所示:

opencv 学习笔记六 边缘检测

在上图中,假设一张5*5的image,左边为sobel算子计算的梯度大小,右边为计算的梯度方向,位于(1, 1)像素位置处的梯度大小为912, 梯度方向为120。上图左边画出了坐标轴和梯度方向,可以发现,沿着梯度方向的梯度值为(0,2)处的292和(2,0)处的276,由于912大于这两个梯度值,所以912为极大值。 按照这样的规则遍历每一个像素点,对于非极大值的像素点,需要将其梯度大小置为0;

(3) 双阈值的滞后阈值处理

这一步我们设置两个阈值

opencv 学习笔记六 边缘检测opencv 学习笔记六 边缘检测 ,遍历所有像素:
  1. 梯度大小大于opencv 学习笔记六 边缘检测的像素点被归为”确定边缘”像素,被保留;
  2. 梯度大小小于opencv 学习笔记六 边缘检测的像素点被认为一定不属于边缘,被丢弃。
  3. 梯度大小介于opencv 学习笔记六 边缘检测opencv 学习笔记六 边缘检测之间的像素点,如果它们连接到”确定边缘”像素,则它们被视为边缘的一部分。否则,它们也会被丢弃opencv 学习笔记六 边缘检测3. Prewitt算子

prewitt边缘检测算子如下图所示,分别为水平方向和垂直方向的卷积核(锚点为中心点),再进行边缘检测时,也是先分别进行水平和垂直方向的差分计算,最后再进行合并。

opencv 学习笔记六 边缘检测

prewitt算子的来个卷积核是可分离的,如下图所示。对于水平方向的卷积核,可以拆分为一个垂直方向上的均值平滑卷积核和水平方向的差分卷积核,因此prewitt水平算子,相当于先进行了垂直方向的均值平滑,然后再进行水平方向的差分卷积运算。同样prewitt垂直算子,相当于先进行水平方向的均值平滑,再进行垂直方向的差分卷积。 所以相比于Robert算子,Prewitt算子多了一个平滑操作,所以其受噪声干扰小。

opencv 学习笔记六 边缘检测
4.sobel算子

sobel算子的两个卷积核如下,也分为水平方向和垂直方向的卷积核(锚点为中心点),其卷积核也是可以差分,相比于prewitt算子,只是其平滑卷积核由均值平滑变成了高斯平滑,差分卷积核还是一样的。

opencv 学习笔记六 边缘检测

sobel卷积核除了三阶,还可以是高阶的,通过其两个分离卷积核,进行矩阵乘法可以得到,下面是两个5*5的sobel卷积核:

opencv 学习笔记六 边缘检测
5.Scharr算子

scharr算子和3阶的Sobel边缘检测算子类似,其对应两个卷积核如下:

opencv 学习笔记六 边缘检测

opencv提供了cv2.Scharr()函数进行Scharrr边缘检测,其对应参数如下:(注意没有szie参数)

dst= cv2.Scharr(src,ddepth,dx,dy,scale,delta,borderType)
        src: 输入图像对象矩阵,单通道或多通道
        ddepth:输出图片的数据深度,注意此处最好设置为cv.CV_32F或cv.CV_64F
        dx:dx不为0时,img与差分方向为水平方向的Sobel卷积核卷积
        dy: dx=0,dy!=0时,img与差分方向为垂直方向的Sobel卷积核卷积

            dx=1,dy=0: 与差分方向为水平方向的Sobel卷积核卷积
            dx=0,dy=1: 与差分方向为垂直方向的Sobel卷积核卷积
       (注意必须满足: dx >= 0 && dy >= 0 && dx+dy == 1)

        scale: 放大比例系数
        delta: 平移系数
        borderType:边界填充类型

下面我用canny边缘提取和Roberts边缘提取做个例子

程序范例:


#include <iostream>
#include <opencv2 opencv.hpp>
#include <opencv2 core.hpp>
#include <opencv2 highgui.hpp>
#include <stdio.h>

using namespace cv;
using namespace std;

RNG rng(12345);
Scalar color[7] = {
    (Scalar(0,0,255)),//&#x7EA2;&#x8272;
    (Scalar(0,255,0)),//&#x7EFF;&#x8272;
    (Scalar(255,0,0)),//&#x84DD;&#x8272;
    (Scalar(255,255,0)),//&#x6D45;&#x84DD;&#x8272;
    (Scalar(255,0,255)),//&#x7D2B;&#x8272;
    (Scalar(0,255,255)),//&#x9EC4;&#x8272;
    (Scalar(128,128,192)),//&#x6D45;&#x7C89;&#x8272;
};
int main()
{
    Mat image,gray_img,thread_img, dst2_img, dst3_img, dst_img;

    image = imread("../basketball.jpg", 1);
    if (image.empty()) {
        cout << "&#x65E0;&#x6B64;&#x56FE;&#x7247;" << endl;
        return 0;
    }
    cvtColor(image, gray_img,COLOR_RGB2GRAY,0);//&#x5C06;&#x56FE;&#x50CF;&#x8F6C;&#x6362;&#x4E3A;&#x7070;&#x5EA6;&#x56FE;

    threshold(gray_img, thread_img, 100, 255, THRESH_BINARY_INV);//&#x5C06;&#x7070;&#x5EA6;&#x56FE;&#x8F6C;&#x6362;&#x4E3A;&#x4E8C;&#x503C;&#x56FE;

    while (1)
    {
        imshow("&#x539F;&#x56FE;", image);
        waitKey(1);

        Mat robert135 = (Mat_<char>(2, 2) <<  1,0,
                                               0,-1);
        filter2D(thread_img, dst2_img, image.depth(), robert135);

        Mat robert45 = (Mat_<char>(2, 2) << 0,1,
                                             -1,0);
        filter2D(thread_img, dst3_img, image.depth(), robert45);

        addWeighted(dst2_img, 1, dst3_img, 1, 0, dst_img);
        imshow("robert", dst_img);
        waitKey(1);

        Canny(thread_img, dst_img, 80, 160, 3);
        imshow("Canny", dst_img);
        waitKey(1);
    }
    return 1;
}
</char></char></stdio.h></opencv2></opencv2></opencv2></iostream>

opencv 学习笔记六 边缘检测

Original: https://blog.csdn.net/qq_36947916/article/details/122719704
Author: 逐梦者-未来
Title: opencv 学习笔记六 边缘检测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/645140/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SimpleITK学习笔记

    SimpleITK学习笔记 前言 1 sitk中的常见属性值 2 读取和保存图像 3 像素类型 4 SimpleITK图像数据和Numpy矩阵数据之间的转换 5 访问像素和切片 6…

    人工智能 2023年6月19日
    089
  • 机器学习之KNN检测恶意流量

    背景 任何智能活动的都可以称为人工智能,而机器学习(Machine Learning)属于人工智能的一个分支,深度学习(Deep Learning)则是机器学习的分支。近年来,随着…

    人工智能 2023年6月27日
    082
  • 运行YOLOv5检测模型识别出现的问题

    一、下载YOLOv5源码网址:https://github.com/ultralytics/yolov5/tree/v5.0下载的版本:V5.0问题1:要把配置好的pytorch环…

    人工智能 2023年7月19日
    036
  • 图计算思维与实践 (一)概览

    前言 说起图计算,可能很多人能想到的是曾经学过图数据结构、复杂网络等,对于其在工程中的实际应用知之甚少。亦或者,很多人听说过知识图谱,却很少想过它是用一种什么样的方式在解决什么样的…

    人工智能 2023年6月1日
    089
  • 《Remote Sensing》期刊 从投稿到录用过程

    本人研究方向:激光雷达数据处理与三维点云语义分割录用文章的方向: 对多光谱LiDAR点云数据进行语义分割的研究文章:单栏,19页文章投Remote Sensing期刊从投稿到onl…

    人工智能 2023年6月23日
    099
  • 目标检测常用损失函数

    学习目标检测的同学一定对损失函数非常头疼。在求分类时会遇到0-1损失,交叉熵损失,在求回归框的时候需要用到L1损失、L2损失以及各种IoU损失。而我们本身又不是很了解这些损失函数,…

    人工智能 2023年7月12日
    054
  • 嵌入式开发—交叉编译OpenCV

    编译平台:Ubuntu18.04 x86平台 目标平台:ZYNQ-7100 Ubuntu20 ARM 交叉编译工具:gcc-linaro-7.5.0-2019.12-x86_64_…

    人工智能 2023年7月20日
    055
  • KNN算法数字识别完整代码——打开就可以跑

    目录 1、原理 2、数据集 3、代码以及注释 1. 数据准备: 2. 构建训练数据集: 3. 测试集数据测试: 4、运行结果 5、总结 6、致谢 1、原理 邻近算法,或者说K最近邻…

    人工智能 2023年7月16日
    068
  • 知识图谱task02

    一.搭建知识图谱 下载基于医疗领域知识图谱的问答系统 git clone https://github.com/zhihao-chen/QASystemOnMedicalGraph…

    人工智能 2023年6月10日
    073
  • SpringCloud优化记录

    设置服务中每个 hystrix 线程池的大小,以及 如何设置超时时间呢? 假设你的服务A,每秒钟会接收30个请求,同时会向服务B发起30个请求,然后每个请求的响应时长经验值大概在2…

    人工智能 2023年6月28日
    050
  • Canal使用

    下面我们就开启mysql的主从同步机制,让Canal来模拟salve Canal是基于MySQL的主从同步功能,因此必须先开启MySQL的主从功能才可以。 这里以之前用Docker…

    人工智能 2023年6月29日
    059
  • Windows 10系统下如何搭建轻量级目标检测NanoDet-plus环境?

    NanoDet与YOLO一样,都是目标检测算法中的经典之作,在NanoDet-plus发布之后,很多CVer都争先恐后地进行尝试,感受其与NanoDet的不同。以上的截图已经将Na…

    人工智能 2023年7月12日
    057
  • tensorflow基础学习-anaconda方式安装tensorflow(gpu-1.15.0版本)

    前言 关于anaconda方式安装tensorflow(cpu版本)之前已经有博客写过了。这一次更新一下anaconda方式安装tensorflow(gpu版本),他们的区别在于T…

    人工智能 2023年5月25日
    083
  • python在读取excel文件时发生XLRDError错误

    python在读取excel文件时发生XLRDError错误 使用背景 * 一、 pandas操作xlsx类型数据 二、读取xls类型数据 三、读取xls错误解决 使用背景 最近学…

    人工智能 2023年7月9日
    072
  • pandas基础

    pandas是python语言的扩展库,用于数据分析。 pandas可以使数据构建成一维或者二维数组保存起来,类似于表格。 pandas数据结构 1.Series(一维数据) 2….

    人工智能 2023年7月7日
    044
  • 神经网络输入层的作用,神经网络输入层输出层

    输入层是几维的输出层是几维的 输入层是几维的输出层是第n层,等于3n-2,3n-1,3n。虽是3层神经网络,但是去叫做两层BP网络,因为输入层一般不算做一层。 n就该取2,s1就是…

    人工智能 2023年7月14日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球