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()

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈旧项目如何添加新依赖

Spring项目创建之后,还想添加新的依赖(如Spring框架内置的依赖),可以安装插件: 装完该插件之后,就可以在pom.xml文件里,右键选择 Generate即可出现下述界面: 点击ok即可添加新的…

服务器硬件基础知识学习

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

最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型

一、系统简介 本文将介绍最新的一站式AI创作中文系统(集成ChatGPTMidjourneySunoStable Diffusion)——星河易创AI系统,该系统基于ChatGPT的核心技术,融合了自然语言问答、绘画、音乐、文档分享、图片识别等创作功能,…

统信UOS桌面操作系统1070上使用notepad--文本编辑器

原文链接:统信UOS桌面操作系统1070上使用notepad–文本编辑器 Hello,大家好啊!今天我要向大家推荐一款在统信UOS桌面操作系统1070上非常好用的文本编辑器软件——“notepad–”。这款软件功能强大、操作简便,特别适合开发人员和日…

enum4linux一键查询SMB信息(KALI工具系列十六)

目录 1、KALI LINUX简介 2、enum4linux工具简介 3、在KALI中使用enum4linux 3.1 目标主机IP(win) ​编辑 3.2 KALI的IP 4、操作示例 4.1 运行工具 4.2 列出用户名 4.3 提取用户名 4.4 使用自定义RID范围 4.5 列出组 4.6 列出共享文件夹 4.7…

自动评论自动私信引流系统,自动化时代的挑战与机遇

随着科技的飞速发展,自动化技术已经渗透到我们生活的方方面面。从工业生产线上的机械臂到家庭中的智能助手,自动化不仅改变了我们的工作方式,也在重塑着社会的面貌。然而,在享受自动化带来的便利和效率的同时,我们也必…

时间序列的谱分解pt.2

16.dvi (berkeley.edu)https://www.stat.berkeley.edu/~bartlett/courses/153-fall2010/lectures/16.pdfpt1 时间序列的谱分解-CSDN博客

Linux--Socket编程基础

一、Socket简介 套接字( socket )是 Linux 下的一种进程间通信机制( socket IPC ), 使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台…

深度学习之加宽全连接

1.Functional API 搭建神经网络模型 1.1.利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_spli…

【免费Web系列】JavaWeb实战项目案例三

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 部门管理开发 1. 删除部门 1.1 需求分析 删除部门数据。在点击 "删除" 按钮,会根据ID删除部门数据。 了解了需求之后,我们再看看接口文档中,关于删除部门…

还没搞懂作用域、执行上下文、变量提升?看这篇就够啦

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 作用域(Scope) 全局作用域 函数作用域 块级作用域…

编译选项导致的结构体字节参数异常

文章目录 前言问题描述原因分析问题解决总结 前言 在构建编译工程时,会有一些对应的编译配置选项,不同的编译器,会有对应的配置项。本文介绍GHS工程中编译选项配置不对应导致的异常。 问题描述 在S32K3集成工程中,核1的INP_SWC…

【并发程序设计】15.信号灯(信号量)

15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制,它主要用于控制对共享资源的访问。 在Linux系统中,信号灯作为一种进程间通信(IPC)的方式,与其他如管道、FIFO或共享内存等IPC方式不同&…

c++ 哈希 unordered_map unordered_set 的学习

1. unordered 系列 在 c98 中, STL 提供了底层是红黑树结构的一系列关联式容器,set 和 map 的查询效率可以达到 log2N,红黑树最差的情况也只是需要比较红黑树的高度次,当节点数量非常多时,查找一个节点还需要比较几十…

护肤品美妆商城小程序的作用是什么

经营美妆的方式多种多样,商场街边、电商平台、微商等,无论厂商品牌还是经销商批发零售都有大量目标群体,客户在哪里商家就应该在哪里,私域生意模式,商家需要线上多渠道获客转化和提高营收。 运用【雨科】平台搭建护肤…

PatchEmbed

PatchEmbed 是用于计算机视觉任务的神经网络层,特别是在Vision Transformer (ViT) 模型中使用。它负责将输入的图像分割成固定大小的图像块(patches),并将这些图像块线性嵌入到高维空间中。这是Vision Transformer处理图像的方式&…

JVM虚拟机性能监控工具

命令行工具 jps 虚拟机进程状况查询工具 jps(JVM Process Status Tool),可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称或者jar文件名,还有这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。 # …

Vue.js 与 TypeScript(1) :项目配置、props标注类型、emits标注类型

像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误,也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全,TypeScript 还改善了开发体验和效率。 一、项目配置 在使用 npm cr…

AI 网页解锁器,用于网页抓取一切 | 最快的验证码解决服务

想象一下,解锁互联网的全部潜力,数据自由流动,没有任何障碍阻挡你获取所需信息。在网络爬虫的世界里,这个梦想常常会遇到障碍:CAPTCHA和反机器人措施,这些措施旨在保护网站免受自动化访问的侵害。但如果有一…

蓝桥杯软件测试-十五届模拟赛2期题目解析

十五届蓝桥杯《软件测试》模拟赛2期题目解析 PS 需要第十五界蓝桥杯模拟赛2期功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试模拟赛2期 题目1:功能测试题目 1(测试用例&…