OpenCV入门10:边缘检测

news/2025/3/19 23:03:59/

边缘检测是图像处理中常用的操作,用于检测图像中的边缘或轮廓。在OpenCV中,提供了一些函数和方法用于执行边缘提取操作。下面将介绍一些常见的边缘提取方法及其在OpenCV中的实现方式:

  • Canny边缘检测:

Canny边缘检测是一种经典的边缘检测算法,它具有较好的边缘定位和抑制噪声的能力。Canny边缘检测算法包括以下步骤:灰度化、高斯滤波、计算梯度幅值和方向、非最大抑制、双阈值处理和边缘连接。在OpenCV中,可以使用cv::Canny()函数进行Canny边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 
cv::Mat edges; 
cv::Canny(image, edges, 100, 200); // Canny边缘检测
  • Sobel算子:

Sobel算子是一种通过计算图像中像素梯度来检测边缘的方法。它分别在水平和垂直方向上应用一维的Sobel模板,然后对两个方向上的梯度进行合成。在OpenCV中,可以使用cv::Sobel()函数来进行Sobel边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 cv::Mat edges; 
cv::Sobel(image, edges, CV_8U, 1, 1); // Sobel边缘检测
  • Scharr算子:

Scharr算子是一种改进的Sobel算子,可以提供更加敏锐和准确的边缘检测结果。它与Sobel算子类似,但使用了不同的系数。在OpenCV中,也可以使用cv::Scharr()函数来进行Scharr边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 
cv::Mat edges; 
cv::Scharr(image, edges, CV_8U, 1, 0); // Scharr边缘检测,水平方向
  • Laplacian算子:

Laplacian算子是一种二阶微分算子,可以用于检测图像中的边缘。它通过计算图像中像素灰度值的二阶导数来提取边缘信息。在OpenCV中,可以使用cv::Laplacian()函数进行Laplacian边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 
cv::Mat edges; 
cv::Laplacian(image, edges, CV_8U); // Laplacian边缘检测
  • Roberts算子:

Roberts算子是一种简单的离散差分算子,用于检测图像中的边缘。该算子通过计算图像中像素灰度值的差分来提取边缘信息。在OpenCV中,可以使用cv::filter2D()函数来实现Roberts边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 
cv::Mat edges; 
cv::Mat robertsX = (cv::Mat_<float>(2, 2) << 1, 0, 0, -1); // Roberts算子模板X 
cv::Mat robertsY = (cv::Mat_<float>(2, 2) << 0, 1, -1, 0); // Roberts算子模板Y 
cv::filter2D(image, edges, CV_32F, robertsX); // Roberts边缘检测,水平方向
  • Prewitt算子:

Prewitt算子是一种另一种基于差分的边缘检测算子。它类似于Sobel算子,但使用了不同的差分模板。在OpenCV中,也可以使用cv::filter2D()函数来进行Prewitt边缘检测。以下是一个示例:

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 
// Prewitt算子模板X 
cv::Mat edges; cv::Mat prewittX = (cv::Mat_<float>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1); 
// Prewitt算子模板Y 
cv::Mat prewittY = (cv::Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1); 
cv::filter2D(image, edges, CV_32F, prewittX); // Prewitt边缘检测,水平方向

除了以上提到的算法,OpenCV还提供了更多的边缘提取方法和函数,如SobelX/SobelY函数、ScharrX/ScharrY函数等。读者可以根据具体需求选择合适的算法来进行边缘提取。

希望以上内容能够帮助读者熟悉OpenCV中的边缘提取算法。如果有问题,请留言提问!


http://www.ppmy.cn/news/1211839.html

相关文章

Qt 事件循环

引出 UI程序之所叫UI程序&#xff0c;是因为需要与用户有交互&#xff0c;用户交互一般是通过鼠标键盘等的输入设备&#xff0c;那UI程序就需要有能随时响应用户交互的能力。 一个C程序的main函数大概是下面这样&#xff1a; int main() {...return 0; } 我们如何使程序能随…

K8S知识点(八)

&#xff08;1&#xff09;实战入门-Label 通过标签实现Pod的区分&#xff0c;说白了就是一种标签选择机制 可以使用命令是否加了标签&#xff1a; 打标签&#xff1a; 更新标签&#xff1a; 筛选标签&#xff1a; 修改配置文件&#xff0c;重新创建一个pod 筛选&#xff1…

C语言自增自减运算符

自增自减运算符介绍 自增运算符 作用&#xff1a;使得变量 1 int a 10; a; // a 11;自减运算符 – 作用&#xff1a;使得变量 -1 int a 10; a--; // a 9;前置自增和后置自增 前置&#xff08;前缀&#xff09;自增&#xff1a; 在变量前添加符号 a 后置&#xff08;后…

积极应对云网络安全

以下是 IT 领导者需要了解的内容&#xff0c;才能在云网络安全方面占据上风。 如果您的组织尚未主动解决云网络安全问题&#xff0c;则将面临灾难的风险。等待攻击发生根本没有意义。 主动云安全会采取积极措施来发现潜在威胁并在网络攻击发生之前阻止网络攻击。 这是通过持…

Netty第三部

继续Netty第二部的内容 一、ChannelHandler 1、ChannelHandler接口 ChannelHandler是Netty的主要组件&#xff0c;处理所有的入站和出站数据的应用程序逻辑的容器&#xff0c;可以应用在数据的格式转换、异常处理、数据报文统计等 继承ChannelHandler的两个子接口&#xff…

SAM + YOLO 智能抠图

在计算机视觉领域&#xff0c;对象检测和实例分割是使机器能够理解视觉数据并与之交互的关键任务。 准确识别和隔离图像中的物体的能力具有许多实际应用&#xff0c;从自动驾驶车辆到医学成像。 在这篇博文中&#xff0c;我们将探索如何在 Roboflow 和 Ultralytics YOLOv8 的帮…

C/S架构学习之基于UDP的本地通信(服务器)

基于UDP的本地通信&#xff08;服务器&#xff09;&#xff1a;创建流程&#xff1a;一、创建数据报式套接字&#xff08;socket函数&#xff09;&#xff1a; int sock_fd socket(AF_UNIX,SOCK_DGRAM,0);if(-1 sock_fd){perror("socket error");exit(-1);}二、创建…

SQLite常用语句

1. 模糊查询 Curosr cursorsqLiteDatabase.query("tableName", null,"ask?",new String[]{"%"queryStrigg"%"},null,null,null); 参数分别为&#xff0c;表名&#xff0c;查询列名&#xff08;null表示查询所有列&#xff09;&…