OpenCV 的几种查找图像中轮廓边缘的方法

 原始图片:

 

1、Sobel()

Sobel 算子结合了高斯平滑和微分,用于计算图像的梯度,从而突出显示边缘。

import cv2# 读取图像
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直边缘
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)# 叠加水平和垂直边缘
edges = cv2.addWeighted(cv2.convertScaleAbs(sobel_x), 0.5, cv2.convertScaleAbs(sobel_y), 0.5, 0)# 显示结果
cv2.imshow("Original Image", image)
cv2.imshow("Edges", edges)cv2.waitKey(0)
cv2.destroyAllWindows()

函数原型:

sobel = cv2.Sobel(src, ddepth, dx, dy, ksize, scale, delta, borderType) 

参数说明:

  1. src: 输入图像(单通道,例如灰度图)。
  2. ddepth: 输出图像的深度(例如 cv2.CV_64F 表示 64 位浮点数)。
  3. dx: x 方向上的导数阶数(0表示没有导数,1表示一阶导数)。
  4. dy: y 方向上的导数阶数(与 dx 类似)。
  5. ksize: Sobel 核的大小,必须是 1, 3, 5 或 7 等奇数。
  6. scale: 可选值,缩放导数结果,以便调整图像亮度(默认值为 1)。
  7. delta: 可选值,在存储之前添加到结果中的值(默认值为 0)。
  8. borderType: 边界类型,用于确定图像边界(默认值为 cv2.BORDER_DEFAULT)。

 2、Scharr()

Scharr 算子是一种改进的 Sobel 算子,适用于增强边缘检测的精度,在正常的 Sobel 核的尺寸上有更好的性能。

scharr_x = cv2.Scharr(src, ddepth, dx, dy, scale, delta, borderType)

参数说明:

  • 与 cv2.Sobel() 相同,只是 ksize 参数被硬编码为 3。

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 使用 Scharr 算子计算 x 和 y 方向上的梯度
grad_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)
grad_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)# 将梯度取绝对值并转换为 8 位图像
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)# 合并 x 方向和 y 方向的梯度
scharr = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 显示图像
cv2.imshow('Scharr Edge Detection', scharr)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

3、Canny()

Canny 边缘检测是一种多级边缘检测算法,效果较为显著,常用来检测图像中的明显边缘。

 函数原型:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

参数说明:

  • image: 输入图像,通常是灰度图。
  • threshold1: 较低的阈值,用于边缘检测的滞后阈值过程。
  • threshold2: 较高的阈值。
  • apertureSize: Sobel 算子的大小,默认值为 3。
  • L2gradient: 可选参数,用于计算图像梯度幅值的标志。如果为 True,则使用更精确的 L2 范数计算梯度,否则使用 L1 范数。
  • import cv2# 读取图像并转换为灰度图
    image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 使用 Canny 边缘检测
    edges = cv2.Canny(image, 100, 200)# 显示图像
    cv2.imshow('Canny Edge Detection', edges)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4、Laplacian ()

Laplacian 算子是一种二阶导数算子,用于检测图像中的边缘。

laplacian = cv2.Laplacian(src, ddepth, ksize, scale, delta, borderType)

参数说明:

  • src: 输入图像。
  • ddepth: 输出图像的深度。
  • ksize: Laplacian 算子的大小,必须是正奇数。
  • scale: 可选参数,用于缩放导数值,默认值为 1。
  • delta: 可选参数,在存储之前添加到结果中的值,默认值为 0。
  • borderType: 边界模式,默认值为 cv2.BORDER_DEFAULT
    import cv2
    import numpy as np# 读取图像并转换为灰度图
    image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 使用 Laplacian 边缘检测
    laplacian = cv2.Laplacian(image, cv2.CV_64F)# 将结果转换为 8 位图像
    laplacian = cv2.convertScaleAbs(laplacian)# 显示图像
    cv2.imshow('Laplacian Edge Detection', laplacian)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

5、Prewitt算子

Prewitt 算子是另一种一阶导数算子,可以检测水平和垂直边缘。虽然 OpenCV 没有直接提供 cv2.prewitt() 函数,但可以使用 cv2.filter2D 函数自定义 Prewitt 核来实现。 

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 定义 Prewitt 核
prewitt_kernel_x = np.array([[1, 0, -1],[1, 0, -1],[1, 0, -1]])
prewitt_kernel_y = np.array([[1, 1, 1],[0, 0, 0],[-1, -1, -1]])# 使用 Prewitt 核进行边缘检测
grad_x = cv2.filter2D(image, cv2.CV_64F, prewitt_kernel_x)
grad_y = cv2.filter2D(image, cv2.CV_64F, prewitt_kernel_y)# 计算梯度幅值
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)
prewitt = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 显示图像
cv2.imshow('Prewitt Edge Detection', prewitt)
cv2.waitKey(0)
cv2.destroyAllWindows()

  

 6、Roberts Cross算子

罗伯特交叉算子是一种简单且快速的边缘检测算子,适用于检测图像的对角边缘。OpenCV 中没有直接提供罗伯特交叉算子,但可以通过自定义卷积核实现。

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义 Roberts 核
roberts_kernel_x = np.array([[1, 0],[0, -1]])
roberts_kernel_y = np.array([[0, 1],[-1, 0]])# 使用 Roberts 核进行边缘检测
grad_x = cv2.filter2D(image, cv2.CV_64F, roberts_kernel_x)
grad_y = cv2.filter2D(image, cv2.CV_64F, roberts_kernel_y)# 计算梯度幅值
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)
roberts = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 显示图像
cv2.imshow('Roberts Edge Detection', roberts)
cv2.waitKey(0)
cv2.destroyAllWindows()

7、自定义卷积核

还可以通过自定义卷积核来进行边缘检测。

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 定义自定义卷积核
custom_kernel = np.array([[-1, -1, -1],[-1, 7, -1],[-1, -1, -1]])# 使用自定义卷积核进行边缘检测
custom_edges = cv2.filter2D(image, cv2.CV_64F, custom_kernel)# 将结果转换为 8 位图像
custom_edges = cv2.convertScaleAbs(custom_edges)# 显示图像
cv2.imshow('Custom Kernel Edge Detection', custom_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

 8、基于直方图的边缘检测

基于直方图的方法,通过分析图像的灰度直方图来检测边缘。

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 计算图像的直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])# 找到直方图的峰值
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)# 使用峰值作为阈值进行二值化处理
_, binary = cv2.threshold(image, max_loc[1] - 30, 255, cv2.THRESH_BINARY)# 显示图像
cv2.imshow('Histogram Based Edge Detection', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

9、adaptiveThreshold()

自适应阈值

自适应阈值可以在照明不均匀的情况下检测边缘。

函数原型:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])

参数说明:

  • src:输入图像,应为灰度图像(单通道)。
  • maxValue:指定在满足条件时给输出像素赋予的最大值(通常为255)。
  • adaptiveMethod:自适应方法。可选值有:
    • cv2.ADAPTIVE_THRESH_MEAN_C:基于邻域均值的自适应阈值化方法。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:基于邻域加权均值的自适应阈值化方法。
  • thresholdType:阈值类型,应为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV
  • blockSize:指定用于计算阈值的邻域大小,一般为奇数。
  • C:从计算的平均值或加权平均值中减去的常数。

import cv2# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 自适应阈值
adaptive_threshold = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 显示图像
cv2.imshow('Adaptive Threshold Edge Detection', adaptive_threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

10、threshold()

阈值化 (cv2.threshold)

简单的全局阈值化方法,通过固定的阈值来二值化图像以检测边缘。

import cv2# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 全局阈值化
_, threshold = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示图像
cv2.imshow('Global Threshold Edge Detection', threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑企业有闲置资质怎么办?

如果建筑企业拥有闲置资质,可以考虑以下几种方式来充分利用这些资质: 1. 租赁或转让资质: 将闲置的建筑资质租赁给其他企业或个人使用,或者通过转让的方式将资质出售给有需要的企业或个人。 2. 提供咨询服务: 利用建…

OneForall工具的下载安装和使用(Windows和Linux)

目录 OneForall的介绍 OneForall的下载 OneForall的安装 安装要求 安装步骤(git 版) 安装(kali) OneForall的使用命令 在Windows 在Linux(kali) OneForall的结果说明 免责声明 本文所提供的文字和…

车辆前向碰撞预警系统性能要求和测试规程

前言 本文整理《GB/T 33577-2017 智能运输系统-车辆前向碰撞预警系统性能要求和测试规程》国标文件关键信息,FCW系统性能和测试右给深层次的认识。 术语和定义 车辆前向碰撞预警系统 forward vehicle collision warning system自车 subject vehicle(SV)目标车辆 target ve…

【Linux】查找和压缩

一、文件查找 1、命令查找 which 2、文件查找、依赖数据库 locate 3、文件查找 find 语法:find [path] [options] [expression] [action] ①按文件名 -name按名 -iname可不区分大小写 ②按文件大小 5M:5M以上文件 5M:5M文件 -…

高中数学:解三角形相关公式总结及用法总结

一、正弦定理 二、余弦定理 三、三角形面积公式 由正弦定理,可以推出三角形的面积公式: S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法总结 五、练习 例题1 解析 对条件等式进行变形,结合余弦定理,求出∠A的度数,从而…

Nginx01-HTTP简介与Nginx简介(安装、命令介绍、目录介绍、配置文件介绍)

目录 HTTP简介HTTP原理查看访问网站的详细流程curl -vwget --debug 查看网站访问量HTTP协议版本HTTP协议交互HTTP 请求请求报文起始行请求头 HTTP响应响应报文起始行响应头 Nginx常见的Web服务常见网站服务 安装NginxNginx目录结构Nginx启动管理Nginx常用命令 Nginx配置文件主配…

国内外主流大模型语言技术大比拼

国内外主流大模型语言技术对比 2024 自2017年起,美国深度布局人工智能,全面融入经济、文化与社会。至2023年,中国凭借自研技术平台崭露头角,ChatGPT及其技术成国家战略焦点,引领未来科技浪潮。中美竞逐,人工…

香橙派 AI pro:AI 加速初体验

香橙派 AI pro:AI 加速初体验 在AI领域,不断涌现的硬件产品为开发者提供了前所未有的便利和可能性。今天,我要介绍的这款产品——香橙派 AIpro,就是其中的佼佼者。在昇腾 AI 芯片的加持下,这款开发板有着出色的算力。…

961题库 北航计算机 操作系统 附答案 选择题形式

有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 计算机系统的组成包括( ) A、程序和数据 B、处理器和内存 C、计算机硬件和计算机软件 D、处理器、存储器和外围设备 财务软件是一种&#xff…

【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 对话框 | 模态对话框 文章编号:Qt 学习笔记 / 51…

Java反序列化漏洞与URLDNS利用链分析

前言 前面学习过 Java 反序列化漏洞的部分知识,总结过几篇文章: 文章发布日期内容概括《渗透测试-JBoss 5.x/6.x反序列化漏洞》2020-07-08JBoss 反序列化漏洞 CVE-2017-12149 的简单复现,使用了 ysoserial 和 CC5 链,未分析漏洞…

easy-captcha生成验证码

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

(2024,扩散,去噪调度,维度,误差,收敛速度)适应基于分数的扩散模型中的未知低维结构

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 1.1 扩散模型 1.2 现有结果的不…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储&#xff0c;再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派&#xff1a;我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的&#xff0c;它们支持多核处理&#xff0c;能够应对…

语言模型的校准技术:增强概率评估

​ 使用 DALLE-3 模型生成的图像 目录 一、说明 二、为什么校准对 LLM 模型至关重要 三、校准 LLM 概率的挑战 四、LLM 的高级校准方法 4.1 语言置信度 4.2 增强语言自信的先进技术 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微调方法 5.1 使用代…

集成算法实验与分析(软投票与硬投票)

概述 目的&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;集成多个 集成算法 Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) Boosting&#xff1a;从弱学习器开始加强&am…

排序-插入排序与选择排序

插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 打扑克牌整理手牌用的就是插入排序的思想 代码实现 void InsertSort(int* a, int n) { assert(a); …

米尔MYC-Y6ULX-V2开发板测评记录

文章目录 1、板子上手体验2、板载硬件3、系统信息4、 驱动测试5、编译linux三大件7、摄像头测试9、总结 1、板子上手体验 首先非常感谢芯查查给了这样一个机会来测评这样一款性能十分强大的开发板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及开发板&#xff0c;这块板子具有…

STM32HAL-最简单的长、短、多击按键框架

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法实现长、短、多击按键框架&#xff0c;非常适合移植各类型单片机&#xff0c;特别是资源少的芯片上。接下来将在stm32单片机上实现&#xff0c;只需占用1个定时…