博客
关于我
Prewitt算子边缘检测原理及实现
阅读量:798 次
发布时间:2023-04-15

本文共 2334 字,大约阅读时间需要 7 分钟。

Prewitt算子:图像边缘检测与噪声抑制的双重作用

Prewitt算子是一种经典的图像处理算法,主要用于边缘检测和噪声抑制。作为一种一阶微分算子,它通过分析图像像素的灰度变化,识别图像的边缘。与Roberts算子相比,Prewitt算子在处理噪声方面表现更优,但在边缘精度上稍逊一筹。

Prewitt算子的原理

Prewitt算子的核心在于其卷积核设计。算子的两个主要方向分别为水平和垂直边缘检测。具体来说,水平方向的Prewitt_X卷积核为:

[\text{Prewitt_X} = \begin{bmatrix}1 \ 1 \ 1 \end{bmatrix} * \begin{bmatrix}-1 & 0 & 1 \end{bmatrix}]

垂直方向的Prewitt_Y卷积核为:

[\text{Prewitt_Y} = \begin{bmatrix}1 & 1 & 1 \end{bmatrix} * \begin{bmatrix}1 & 0 & -1 \end{bmatrix}]

这两个卷积核具有可分离的特性。Prewitt_X先对图像进行垂直方向的非归一化均值平滑,然后进行水平方向的差分;而Prewitt_Y则相反。这种设计使得算子在处理噪声时具有抑制作用,同时能够有效检测图像的边缘。

突出Prewitt算子优势

Prewitt算子通过对图像像素进行平均,能够有效抑制噪声。这种均值操作类似于低通滤波,从而在噪声较多的图像中表现出更好的稳定性。然而,Prewitt算子的边缘定位精度稍低于Roberts算子,这是由于其对噪声的抑制作用。

代码实现

以下是Prewitt算子的代码实现示例,主要包括卷积核的定义和图像边缘检测的实现:

#include 
#include
#include
void getPrewittOperators(cv::Mat& horizontal, cv::Mat& vertical, cv::Mat& diagonal1, cv::Mat& diagonal2) { // 定义Prewitt算子的卷积核 horizontal = cv::Mat_
(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1; vertical = cv::Mat_
(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1; diagonal1 = cv::Mat_
(3, 3) << 0, 1, 1, -1, 0, 1, -1, -1, 0; diagonal2 = cv::Mat_
(3, 3) << -1, -1, 0, -1, 0, 1, 0, 1, 1; // 上下翻转卷积核(必要步骤) cv::flip(horizontal, horizontal); cv::flip(vertical, vertical); cv::flip(diagonal1, diagonal1); cv::flip(diagonal2, diagonal2);}void edgeDetection(cv::Mat& src, cv::Mat& dst1, cv::Mat& dst2, cv::Mat& dst3, cv::Mat& dst4, cv::Mat& dst) { // 获取Prewitt算子 cv::Mat horizontal, vertical, diagonal1, diagonal2; getPrewittOperators(horizontal, vertical, diagonal1, diagonal2); // 应用卷积操作 cv::filter2D(src, dst1, CV_32F, horizontal, cv::Point(-1, -1)); cv::filter2D(src, dst2, CV_32F, vertical, cv::Point(-1, -1)); cv::filter2D(src, dst3, CV_32F, diagonal1, cv::Point(-1, -1)); cv::filter2D(src, dst4, CV_32F, diagonal2, cv::Point(-1, -1)); // 边缘强度计算 cv::convertScaleAbs(dst1, dst1); cv::convertScaleAbs(dst2, dst2); cv::convertScaleAbs(dst3, dst3); cv::convertScaleAbs(dst4, dst4); cv::add(dst1, dst2, dst); cv::add(dst3, dst4, dst);}

效果展示

通过实际图像处理,可以观察到Prewitt算子在边缘检测和噪声抑制方面的显著效果。以下是处理后的示例图像:

  • 原始图像(带有噪声)
  • 水平边缘检测结果
  • 垂直边缘检测结果
  • 对角线边缘检测结果
  • 边缘强度叠加结果
  • 通过对比,可以看出Prewitt算子在降低噪声的同时,能够较好地保留图像的边缘信息。

    总结

    Prewitt算子是一种适合图像边缘检测和噪声抑制的高效算法。其独特的卷积核设计使其在处理噪声方面表现优异,但边缘定位精度稍逊于Roberts算子。通过合理应用Prewitt算子,可以在图像处理任务中实现稳定且有效的边缘检测。

    转载地址:http://ngrfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>
    mysql 导入导出大文件
    查看>>
    MySQL 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>