OpenCV(二十六):边缘检测(二)

目录

1.Laplacian算子边缘检测

原理:

Laplacian边缘检测函数Laplacian()

示例代码:

2.Canny算子边缘检测

原理:

Canny算法函数Canny()

示例代码:


1.Laplacian算子边缘检测

原理:

Laplacian算子的原理基于图像的二阶导数。一阶导数可以帮助我们检测图像中的边缘,而二阶导数则可以检测边缘的交叉点,即图像中的角点。

Laplacian算子定义为二阶空间导数的和,在二维情况下用于图像处理,其离散形式如下:

复制代码
L(x, y) = d^2(I(x, y)) / dx^2 + d^2(I(x, y)) / dy^2 

其中,I(x, y)表示图像中的像素值,d^2表示偏导数,dx表示在X方向上的导数,dy表示在Y方向上的导数。

Laplacian算子可以通过应用离散卷积来计算。一种常见的离散Laplacian算子模板如下:

复制代码

通过将该模板与图像进行卷积操作,我们可以计算图像中每个像素的Laplacian响应。

具体步骤如下:

  1. 将图像转换为灰度图像(如果不是灰度图像)。
  2. 对图像应用Laplacian算子的离散模板。
  3. 对卷积结果进行阈值处理,以提取边缘信息。
  4. 可选地对阈值处理后的边缘图像进行非最大抑制和边缘连接等后处理操作。

Laplacian算子的输出结果是一个表示边缘的高频分量图像。边缘通常显示为明亮像素与暗亮像素之间的边界。边缘的宽度和强度取决于Laplacian算子的大小和图像中的灰度变化。

Laplacian边缘检测函数Laplacian()

void cv::Laplacian ( InputArray src,

OutputArray dst,

int ddepth,

int ksize = 1,

double scale = 1,

double delta =0,

int borderType = BORDER DEFAULT

)

  • src:输入原图像,可以是灰度图像和彩色图像。
  • dst: 输出图像,与输入图像src具有相同的尺寸和通道数。
  • ddepth: 输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。
  • ksize:滤波器的大小,必须为正奇数。
  • scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。
  • delta:偏值,在计算结果中加上偏值。
  • borderType:像素外推法选择标志。
示例代码:
复制代码
void Laplacian_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat result,result_g,result_G;
    //未滤波提取边缘
    Laplacian(gray,result,CV_16S,3,1,0);
    convertScaleAbs(result,result);
    //滤波后提取边缘
    GaussianBlur(gray,result_g,Size(3,3),5,0);//高斯滤波
    Laplacian(result_g,result_G,CV_16S,3,1,0);
    convertScaleAbs(result_G,result_G);
    //显示图像
    imwrite("/sdcard/DCIM/result.png",result);
    imwrite("/sdcard/DCIM/result_G.png",result_G);
}

(未滤波提取边缘图像) (滤波后提取边缘图像)

2.Canny算子边缘检测

原理:
Canny算法函数Canny()

void cv::Canny ( InputArray image,

OutputArray edges,

double threshold1,

double threshold2,

int apertureSize = 3,

bool L2gradient = false

)

  • image:输入图像,必须是CV 8U单通道或者三通道图像
  • edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV 8U。
  • threshold1:第一个滞后阙值
  • threshold2:第二个滞后阀值
  • apertureSize: Sobel算子的直径
  • L2gradient:计算图像梯度幅值的标志
示例代码:
复制代码
void Canny_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat resultHigh,resultLow,resultG;
    //大阈值检测图像边缘
    Canny(image,resultHigh,100,200,3);
    //小阈值检测图像边缘
    Canny(image,resultLow,20,40,3);
    //高斯模糊后检测图像边缘
    GaussianBlur(gray,resultG,Size(3,3),5);
    Canny(resultG,resultG,100,200,3);
    //显示图像
    imwrite("/sdcard/DCIM/resultHigh.png",resultHigh);
    imwrite("/sdcard/DCIM/resultLow.png",resultLow);
    imwrite("/sdcard/DCIM/resultG.png",resultG);
}

(大阈值检测图像边缘) (小阈值检测图像边缘) (高斯模糊后检测图像边缘)

相关推荐
Wendy144117 分钟前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
中杯可乐多加冰28 分钟前
五大低代码平台横向深度测评:smardaten 2.0领衔AI原型设计
人工智能
遇见尚硅谷29 分钟前
C语言:20250728学习(指针)
c语言·开发语言·数据结构·c++·笔记·学习·算法
☆璇33 分钟前
【C++】C/C++内存管理
c语言·开发语言·c++
无线图像传输研究探索39 分钟前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
铭哥的编程日记2 小时前
《C++ list 完全指南:从基础到高效使用》
开发语言·c++·list
zzywxc7872 小时前
AI在编程、测试、数据分析等领域的前沿应用(技术报告)
人工智能·深度学习·机器学习·数据挖掘·数据分析·自动化·ai编程
铭keny2 小时前
YOLOv8 基于RTSP流目标检测
人工智能·yolo·目标检测
岁忧2 小时前
(LeetCode 面试经典 150 题 ) 155. 最小栈 (栈)
java·c++·算法·leetcode·面试·go
墨尘游子2 小时前
11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
人工智能·语言模型·自然语言处理