61.​Prewitt 边缘检测算子

目录

        1 概念讲解及用处

        2 函数详解

         3  Prewitt算子

        4 用C++编写代码进行实现

        1 概念讲解及用处

        Prewitt边缘检测算子是基于微分的边缘检测方法之一。它利用图像中邻近像素之间的灰度变化来检测边缘。具体而言,Prewitt算子使用两个3x3的模板对图像进行卷积操作,分别计算水平和垂直方向上的灰度差异。通过计算两个方向上的灰度差的绝对值之和,可以得到边缘的强度。

        Prewitt边缘检测算子可以帮助我们在图像处理任务中准确地提取出物体的边缘信息,为后续的图像分割、目标检测等任务提供支持。

        2 函数详解

        在OpenCV中,可以使用cv::filter2D函数对图像进行 Prewitt边缘检测。具体函数原型如下:

void cv::filter2D(
    InputArray src,
    OutputArray dst,
    int ddepth,
    InputArray kernel,
    Point anchor = Point(-1,-1),
    double delta = 0,
    int borderType = BORDER_DEFAULT
)
参数解释:

src: 输入图像,类型为CV_8U或CV_16U。
dst: 输出图像,与输入图像相同的大小和类型。
ddepth: 输出图像的深度,通常设为-1表示与输入图像相同。
kernel: Roberts算子的卷积核,可以通过创建一个cv::Mat对象来定义。
anchor: 卷积核的锚点位置,默认为(-1, -1)表示位于中心。
delta: 可选的增量值,用于调整输出图像亮度。
borderType: 边界填充方式,默认为BORDER_DEFAULT。

         3  Prewitt算子

         Prewitt边缘检测算子的数学原理是基于一阶微分的边缘检测。它利用两个模板分别计算水平方向和垂直方向上的灰度差分。

        水平方向上的模板:

\begin{bmatrix} -1 & 0 &1 \\ -1& 0&1 \\ -1& 0 & 1 \end{bmatrix}

        垂直方向上的模板:

\begin{bmatrix} -1 & -1 &-1 \\ 0 & 0&0 \\ 1& 1 & 1 \end{bmatrix}

        对于输入图像中的每个像素点,分别与两个模板进行卷积操作,计算水平方向和垂直方向上的灰度差分。然后,将两个方向上的灰度差的绝对值之和作为该像素点的边缘强度。

        4 用C++编写代码进行实现

        下面是使用OpenCV和C++实现Prewitt边缘检测的示例代码:

#include <opencv2/opencv.hpp>

int main()
{
    // 读取输入图像
    cv::Mat src = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
    
    // 创建Prewitt算子的卷积核
    cv::Mat kernelX = (cv::Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
    cv::Mat kernelY = (cv::Mat_<int>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1);
    
    // 进行Prewitt边缘检测
    cv::Mat dstX, dstY;
    cv::filter2D(src, dstX, CV_32F, kernelX);
    cv::filter2D(src, dstY, CV_32F, kernelY);
    
    // 计算两个方向上的灰度差的绝对值之和
    cv::Mat dst = cv::abs(dstX) + cv::abs(dstY);
    
    // 显示结果图像
    cv::imshow("Input", src);
    cv::imshow("Prewitt Edge Detection", dst);
    cv::waitKey(0);
    
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sobel算子、Canny算子Prewitt边缘检测算子和Roberts边缘检测算子都是常用的图像边缘检测算法,它们各有优缺点,下面对它们进行比较: 1. Sobel算子 Sobel算子是一种基于梯度的边缘检测算法,它可以在图像中检测到水平和垂直方向上的边缘。相对于其他算法,Sobel算子计算速度快,易于实现,同时在边缘检测中也有较好的效果。但是,Sobel算子只能检测到水平和垂直方向上的边缘,对于斜向边缘检测效果不太好。 2. Canny算子 Canny算子是一种常用的边缘检测算法,它利用高斯滤波器平滑图像,然后计算梯度,最后使用非极大值抑制和双阈值处理来检测边缘。Canny算子可以检测到所有方向上的边缘,同时它通过双阈值处理可以控制检测到的边缘数量。但是,Canny算子的计算量比较大,运行速度比较慢。 3. Prewitt边缘检测算子 Prewitt算子也是一种基于梯度的边缘检测算法,它与Sobel算子类似,可以检测到水平和垂直方向上的边缘。相对于Sobel算子Prewitt算子的计算量较小,但是在边缘检测中的效果不如Sobel算子。 4. Roberts边缘检测算子 Roberts算子是一种基于微分的边缘检测算法,它使用两个 $2\times 2$ 的卷积核来计算图像中每个像素点的梯度值,从而得到边缘信息。相对于其他算法,Roberts算子计算速度快,但其缺点是对噪声比较敏感,且检测到的边缘比较粗糙。 综上所述,不同的边缘检测算法有各自的优缺点,需要根据实际应用场景进行选择。在一些需要快速处理的场景中,可以选择Sobel算子或Roberts算子;在需要精确检测、对噪声抗干扰的场景中,可以选择Canny算子;在计算资源有限的场景中,可以选择Prewitt算子

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值