《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测

这篇具有很好参考价值的文章主要介绍了《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、Laplacian算子
Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。同时,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。

通常情况下,其算子的系数之和需要为零。 Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用。
Laplacian使用的卷积核如下:
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python
像素点的近似导数值计算:
左图是 Laplacian 算子,右图是一个简单图像,其中有 9 个像素点。
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python
计算像素点 P5 的近似导数值,如下:
P5 = (P2 + P4 + P6 + P8) - 4*P5

下面是一些实际计算的例子:
在左图中,像素点 P5 与周围像素点的值相差较小,得到的计算结果值较小,边缘不明显。
在中间的图中,像素点 P5 与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
在右图中,像素点 P5 与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python

需要注意,在上述卷积核与图像进行卷积运算后,计算结果的值可能为正数,也可能为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。

opencv之Laplacian接口调用:

void Laplacian( InputArray src, OutputArray dst, int ddepth,
                             int ksize = 1, double scale = 1, double delta = 0,
                             int borderType = BORDER_DEFAULT );

src:输入图像,可以是任意通道数的图像,但通常是单通道灰度图像。
dst:输出图像,与输入图像src具有相同的尺寸和通道数
ddepth:输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。,当赋值为-1时,输出图像的数据类型自动选择。
ksize:用于计算二阶导数的核尺寸大小,必须为正奇数。
scale:对导数计算结果进行缩放的缩放因子,默认系数为1,表示不进行缩放。也称对比度
delta:偏值,在计算结果中加上偏值。也称亮度
borderType:像素外推法选择标志,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

ddepth说明:
ddepth 参数表示输出图像的深度,即输出图像的数据类型。它决定了输出图像中像素值的数据范围和存储格式。
常见的选项包括:
CV_8U:8位无符号整数,表示范围为 [0, 255]。
CV_16U:16位无符号整数,表示范围为 [0, 65535]。
CV_16S:16位有符号整数,表示范围为 [-32768, 32767]。
CV_32F:32位浮点数。
CV_64F:64位浮点数。

选择合适的深度类型取决于你的应用和对图像数据的要求。例如,如果你希望保留边缘检测操作中的负值,可能会选择使用浮点数类型(如 CV_64F),因为它可以存储负数。如果你只关心边缘的存在与否而不关心边缘的方向,那么使用无符号整数类型可能更合适。
在Laplacian算子中,通常选择 CV_16S 或 CV_64F 作为 ddepth,因为Laplacian操作可能产生负值,而这些负值在 CV_8U 类型中会被截断为零。在显示图像之前,通常需要对结果进行取绝对值(cv::abs())并进行数据类型转换。

下面代码为使用拉普拉斯检测边缘的一个demo:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() 
{  
    //载入原始图
    Mat src = imread("1.jpg");
    //【1】定义变量
    Mat src_gray, dst, abs_dst;
    //【2】显示原图
    imshow("原始图", src);
    //【3】使用高斯滤波消除噪声
    GaussianBlur(src, src, Size(3, 3), 0);
    //【4】转为灰度图
    cvtColor(src, src_gray, COLOR_BGR2GRAY);
    //【5】Laplacian查找边缘
    Laplacian(src_gray, dst, CV_16S, 3);

    //【6】计算绝对值,并将结果转为8位
    convertScaleAbs(dst, abs_dst);

    //【7】显示效果图
    imshow("Laplacian变换", abs_dst);
    cout << "Laplacian算法输出图像的通道" << abs_dst.channels() << endl;

    waitKey(0);
    destroyAllWindows();

    return 0;
}

效果图如下,左边是原图,右边是拉普拉斯边缘检测图:
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python

2、Scharr 算子
scharr算子和sobel的原理一致(sobel算子看上一章内容),但scharr算子对于边界的梯度计算效果更精确

他们的区别在于:
(1)是Gx和Gy参数的大小不同,也就是卷积核中各元素的权不同,其他都一样,scharr算子对于边界的梯度计算效果更精确;
(2)Scharr算子的核设计更加平滑,这使得其在一定程度上对噪声具有更好的鲁棒性;
(3)由于Scharr算子的核更复杂,因此在计算上可能相对Sobel算子更为耗时。

在实际应用中,选择Scharr还是Sobel通常取决于具体的场景和需求。如果对边缘的敏感度较高,并且噪声较少,Scharr算子可能是一个更好的选择。如果计算效率和简单性更为重要,那么Sobel算子可能更适合。

Scharr在X和Y轴方向的卷积核如下:
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python
opencv之Scharr算子接口说明:

void Scharr( InputArray src, OutputArray dst, int ddepth,
                          int dx, int dy, double scale = 1, double delta = 0,
                          int borderType = BORDER_DEFAULT )

src: 输入图像,可以是任意通道数的图像。
dst: 输出图像,算法的结果将存储在这里。
ddepth: 输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src为CV_32F,可取-1/CV_32F/CV_64F;若src为CV_64F,可取-1/CV_64F。,当赋值为-1时,输出图像的数据类型自动选择。
dx 和 dy: x 和 y 方向的导数阶数,通常为 0 或 1。0表示这个方向上没有求导。
scale: 可选参数,表示缩放因子,默认为1。
delta: 可选参数,表示在卷积结果上加上的偏置,默认为0。
borderType: 可选参数,用于指定边界模式,默认为 cv::BORDER_DEFAULT

代码演示:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() 
{  
    // 读取图像
    cv::Mat image = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);

    // 检查图像是否成功读取
    if (image.empty()) {
        std::cerr << "Error: Could not read the image." << std::endl;
        return -1;
    }

    // 应用Scharr算子分别获取X和Y方向一阶边缘
    cv::Mat scharrX, scharrY;
    cv::Scharr(image, scharrX, CV_16S, 1, 0);
    cv::Scharr(image, scharrY, CV_16S, 0, 1);

   
   // 计算绝对值,并将结果转为8位
  // 因为卷积操作可能产生负值,而这些负值在 CV_8U 类型中会被截断为零。在显示图像之前,通常需要对结果进行取绝对值(cv::abs())并进行数据类型转换。
    convertScaleAbs(scharrX, scharrX);
    convertScaleAbs(scharrY, scharrY);

    // 显示原始图像和Scharr算子的输出
    cv::imshow("Original Image", image);
    cv::imshow("Gradient Magnitude", scharrX + scharrY);

    waitKey(0);![在这里插入图片描述](https://img-blog.yssmx.com/direct/8899b12d049441cb8d7d24a110581414.png)

    destroyAllWindows();

    return 0;
}

效果图如下,左边是原图,右边是Scharr边缘检测图
拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python

3、Log算子
LoG(Laplacian of Gaussian)算子结合了高斯滤波和拉普拉斯边缘检测,用于检测图像中的边缘。LoG算子首先对图像进行高斯平滑,然后应用拉普拉斯算子。这有助于减少噪声的影响,并突出图像中的边缘。
在OpenCV中,cv::GaussianBlur和cv::Laplacian函数可以用于实现LoG算子的操作。文章来源地址https://www.toymoban.com/news/detail-846694.html

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);
    
    // 检查图像是否成功读取
    if (image.empty()) {
        std::cerr << "Error: Could not read the image." << std::endl;
        return -1;
    }

    // 高斯平滑
    cv::Mat blurred;
    cv::GaussianBlur(image, blurred, cv::Size(5, 5), 0);

    // 应用拉普拉斯算子
    cv::Mat laplacian;
    cv::Laplacian(blurred, laplacian, CV_64F);

    // 取绝对值并转换为8位无符号整数
    laplacian = cv::abs(laplacian);
    laplacian.convertTo(laplacian, CV_8U);

    // 显示原始图像和LoG算子的输出
    cv::imshow("Original Image", image);
    cv::imshow("LoG Operator", laplacian);

    // 等待用户按键
    cv::waitKey(0);

    return 0;
}

拉普拉斯算子边缘检测,opencv实用学习,opencv,人工智能,计算机视觉,图像处理,c++,python

到了这里,关于《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记:Opencv实现拉普拉斯图像锐化算法

    2023.8.19 为了在暑假内实现深度学习的进阶学习,Copy大神的代码,记录学习日常 图像锐化的百科: 图像锐化算法-sharpen_lemonHe_的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-contrib-python Code and lena.png:注意你是否在data下由lena.png   附上lena.png  效果所示(解读):

    2024年02月12日
    浏览(32)
  • Opencv 图像金字塔----高斯和拉普拉斯

    原文:图像金字塔----高斯和拉普拉斯 图像金字塔 是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,最主要用于图像的分割、融合。 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。 高斯

    2024年02月09日
    浏览(26)
  • 使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

    工作中遇到,简单整理 人脸识别中,对于模糊程度较高的图像数据,识别率低,错误率高。 虽然使用 AdaFace 模型,对 低质量人脸 表现尤为突出。 但是还是需要对 模糊程度高的图像进行丢弃处理 当前通过 阈值分类 ,符合要求的进行特性提取 实际应用中,可以维护一个 质

    2024年02月15日
    浏览(54)
  • opencv基础46-图像金字塔02-拉普拉斯金字塔

    前面我们介绍了高斯金字塔,高斯金字塔是通过对一幅图像一系列的向下采样所产生的。有时,我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔 前面我们已经介绍过,一幅图像在经过向下采样后,再对其进行

    2024年02月13日
    浏览(32)
  • 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

    图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。 图像金字塔有什么作用? 图像金字塔常用于图像缩放、图像重

    2024年02月04日
    浏览(41)
  • 拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

    [原理及Python实现](含拉氏标定、拉普拉斯标定) 原创文章;转载请注明出处:©️ Sylvan Ding 锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样,应用范围从电子印刷和医学成像到工业检测和军事系统的制导等。利用图像微分可以增强边缘和其他突变(如

    2023年04月10日
    浏览(35)
  • 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质

    傅里叶变换: j w jw j w 拉普拉斯变换: s = σ + j w s=sigma+jw s = σ + j w 有些函数不满足绝对可积条件 ,求解傅里叶变换困难。为此,可用一衰减因子 e − σ t e^{-sigma t} e − σ t ( σ sigma σ 为实常数)乘信号 f ( t ) f(t) f ( t ) ,适当选取 σ sigma σ 的值,使乘积信号 f ( t ) e −

    2024年02月09日
    浏览(48)
  • 拉普拉斯算子

    在介绍拉普拉斯算子概念之前我们先介绍,哈密尔顿算子( ∇ nabla ∇ ),梯度,散度等概念 所谓哈密尔顿算子即为某一物理量在笛卡尔坐标系下的偏导数的矢量和,其运算符号为: ∇ nabla ∇ ,定义如下: ∇ = δ δ x i + δ δ y j + δ δ z k nabla={frac{delta}{delta x}}pmb{i}+{f

    2024年02月09日
    浏览(37)
  • 拉普拉斯变换

    1.公式:设f(t)在t≥0时有定义, 其中s=β+jw。 注:L(1)=   L(sgnt)=   L()= 2.性质         性质1:          性质2:          性质3:         性质4:L()= 推导性质2:使用欧拉公式进行推导 同理,cosat= ,使用分部积分法,经过两次分部积分后会出现原来的积分,通过合并

    2024年02月05日
    浏览(32)
  • 【电路分析】拉普拉斯变换及其应用

    零状态响应 是指电路的外加激励源为零的情况下,由动态元件的初始储能引起的响应。 零输入响应 是指电路的初始状态为零(即换路前电容电压为零,电感电流为零),由外加激励源产生的响应。 该函数在 t0时幅值为1,在 t0 时幅值为-0,在 t=0时函数没有定义但为有限值

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包