opencv 中Canny边缘检测算法原理加每一个(分)步骤的代码演示

2023-11-11

1.原理

1.噪声抑制:输入图像经过高斯平滑滤波,减少噪声的影响。
2.计算梯度:在平滑后的图像上应用Sobel算子计算梯度幅值和方向。
3.非极大值抑制:在梯度方向上,比较每个像素的梯度幅值与其相邻两个像素沿着梯度方向的梯度幅值。如果当前像素的梯度幅值最大,保留该像素,否则抑制(设为0)。

4.双阈值处理:设定高阈值和低阈值,对梯度幅值进行分类。梯度幅值高于高阈值的像素被视为强边缘,低于低阈值的像素被视为弱边缘,位于两者之间的像素被视为可能的边缘。A ⾼于阈值 maxVal 所以是真正的边界点,C 虽然低于 maxVal 但⾼于 minVal 并且与 A 相连,所以也被认为是可能的边界点。⽽ B 就会被抛弃

5.边缘连接:对强边缘像素进行连接,形成连续的边缘线条。
通过跟随弱边缘像素,并且与强边缘像素连接的方式来连接边缘,也就是根据弱边缘像素的位置,并且寻找与之相邻的强边缘像素来连接边缘。

2.代码实现

import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('./base/lena.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 1. 噪声抑制
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# 2. 计算梯度
gradient_x = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)

gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
gradient_direction = np.arctan2(gradient_y, gradient_x)

# 3. 非极大值抑制
rows, cols = gradient_magnitude.shape #去除行和列的像素值
non_maximum_suppression = np.zeros((rows, cols), dtype=np.float32) 

for i in range(1, rows - 1):
    for j in range(1, cols - 1):
        angle = gradient_direction[i, j] * 180 / np.pi #(将弧度转换为角度)
        angle = angle % 180 #取(0-180度)

        if (0 <= angle < 22.5) or (157.5 <= angle <= 180):
        #0°到22.5°或者157.5°到180°之间,表示该像素点的梯度方向为水平方向
            neighbor_pixels = [gradient_magnitude[i, j - 1], gradient_magnitude[i, j + 1]]
        elif 22.5 <= angle < 67.5:
        #梯度方向落在 22.5°到67.5°之间,表示该像素点的梯度方向为主对角线方向
            neighbor_pixels = [gradient_magnitude[i - 1, j - 1], gradient_magnitude[i + 1, j + 1]]
        elif 67.5 <= angle < 112.5:
        #梯度方向落在 67.5°到112.5°之间,表示该像素点的梯度方向为垂直方向
            neighbor_pixels = [gradient_magnitude[i - 1, j], gradient_magnitude[i + 1, j]]
        else:
        #梯度方向落在 112.5°到157.5°之间,表示该像素点的梯度方向为副对角线方向
            neighbor_pixels = [gradient_magnitude[i - 1, j + 1], gradient_magnitude[i + 1, j - 1]]

        if gradient_magnitude[i, j] >= max(neighbor_pixels):
            non_maximum_suppression[i, j] = gradient_magnitude[i, j]

# 4. 双阈值处理
high_threshold = np.max(non_maximum_suppression) * 0.7  #可以自己更改
#梯度值最大值的一定比例(如0.7) 
low_threshold = high_threshold * 0.3   #也可以自己更改
#低阈值设为高阈值的较低比例(如0.3)

strong_edges = (non_maximum_suppression >= high_threshold)
weak_edges = (non_maximum_suppression > low_threshold) & (non_maximum_suppression < high_threshold)

# 5. 边缘连接
edges = np.zeros_like(image)
edges[strong_edges] = [255, 0, 0]  # Strong edges in blue color
#strong_edges 是一个二值图像,其中像素值为 True 表示该位置为强边缘。设置为蓝色
edges[weak_edges] = [0, 0, 255]  # Weak edges in red color
#weak_edges 也是一个二值图像,其中像素值为 True 表示该位置为弱边缘,设为红色

edges_gray = cv2.cvtColor(edges, cv2.COLOR_BGR2GRAY)

# 显示结果
cv2.imshow('Input', image)
cv2.imshow('Canny Edges (Grayscale)', edges_gray)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 中Canny边缘检测算法原理加每一个(分)步骤的代码演示 的相关文章

  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • 带有 OpenCV 的增强现实 SDK [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • opencv如何使用compareHist函数

    img cv2 imread mandrill png histg cv2 calcHist img 0 None 256 0 256 if len sys argv lt 2 print gt gt sys stderr Usage sy
  • 如何使用requirements.txt 在 Heroku python Web 应用程序中安装 Dlib?

    我构建了一个涉及机器学习的 Python Flask Web API 但在 Heroku 上部署它时遇到了很多挫折 问题是 我的应用程序依赖于 Dlib 一个库 我似乎找不到在我的 Heroku 服务器中安装的方法 我正在试图解决这个问题
  • 如何使图像呈现出陈旧、布满灰尘、颜色褪色的外观?

    我有旧画的图像 这些画很旧 布满灰尘 颜色褪色 如图所示here https i stack imgur com xuoEF jpg 如何赋予任何图像这种 旧 外观 我找不到任何过滤器或 openCV 函数来实现这种类型的外观 EDIT 我
  • 使用相位相关和对数极坐标变换获得旋转位移

    我一直在编写一个脚本 它使用 cv2 计算两个图像之间的旋转位移phaseCorrelate method 我有两张图像 第二张是第一张图像的 90 度旋转版本 加载图像后 我将它们转换为对数极坐标 然后将它们传递到phaseCorrela
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • 使用 openCV 和 python 检测物体

    我正在尝试使用 OpenCV 和 Python 检测下图中的白点 我尝试使用函数 cv2 HoughCircles 但没有成功 我需要使用不同的方法吗 这是我的代码 import cv2 cv import numpy as np impo
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • 在 RGB 图像上绘制多类语义分割透明叠加

    我有语义分割掩码的结果 值在 0 1 之间 需要大津阈值来确定什么是积极的 我想直接在 RGB 图像上绘制 在 RGB 图像上每个预测类具有不同的随机颜色 我使用以下内容绘制了具有单一颜色的单个蒙版 是否有一个包或简单的策略可以为多类别做到
  • 如何计算图像中的 RGB 或 HSV 通道组合?

    我使用 python opencv 加载形状为 30 100 3 的图像 现在想要按颜色计算所有颜色的频率 我不是指单个通道 而是指通道组合 含义 3 个频道列表 例如 255 0 0 表示红色 255 255 0 表示黄色 100 100
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • 使用 ffmpeg 或 OpenCV 处理原始图像

    看完之后维基百科页面 http en wikipedia org wiki Raw image format原始图像格式 是任何图像的数字负片 为了查看或打印 相机图像传感器的输出具有 进行处理 即转换为照片渲染 场景 然后以标准光栅图形格
  • 创建 OpenCV 的 mouseCallback 函数的基于类的实现时遇到问题

    正如标题所示 我在基于类的 C 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些麻烦 请允许我解释一下 我定义了一个名为 BriskMatching 的类 在其中创建了一个名为 mouseCallback 的成员函
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h

随机推荐

  • 汉诺塔递归算法(Python编程)

    一 问题描述 汉诺塔是学习计算机递归算法的经典入门案例 是一个数学难题 其问题为如何将所有圆盘从A移动到C 要求一次只能移动一个盘子 盘子只能在3个标杆 A B C 之间移动 更大的盘子不能放在更小的盘子上面 请用Python编写一个汉诺塔
  • latex-列表 itemize enumerate description 自定义

    介绍 latex 主要有三种列表环境 进行罗列的实现 无序列表 itemize 有序列表 enumerate 描述列表 description 本文进行了一一介绍和演示 同时添加了嵌套列表环境和自定义列表环境的说明 latex 列表环境 l
  • 刚开始接触YOLO,记录一下Windows系统下载yolov5与初步进行训练的过程

    一 下载pycharm anaconda 与yolov5 第一步 下载pycharm anaconda pycharm Download PyCharm Python IDE for Professional Developers by J
  • 蓝桥杯2015年第六届真题-牌型种类

    题目 小明被劫持到X赌城 被迫与其他3人玩牌 一副扑克牌 去掉大小王牌 共52张 均匀发给4个人 每个人13张 这时 小明脑子里突然冒出一个问题 如果不考虑花色 只考虑点数 也不考虑自己得到的牌的先后顺序 自己手里能拿到的初始牌型组合一共有
  • 【uni-app】uniapp 实现一键登录 超详细记录~

    uniapp 实现一键登录 一 前置条件 开通uniCloud 开通一键登录功能 二 一键登录代码 云函数代码 三 其他条件 四 遇到过什么问题 如何处理 本地函数同个局域网 错误码 五 官网给出的错误码 参考的文档 官网 一键登录unia
  • Vmware 安装CentOS7时连不上网问题的解决

    在VmWare 上安装Centos7时 装好vmware后还是连不上网 通过查找资料原来是因为有线网卡没有激活 默认centos和redhat7都是不启用有线网卡的 要么手动开启 要么安装时直接启用 所以第一步应该是激活网卡 在桌面点击右键
  • Railway HDU - 3394(tarjan应用)

    题目 有一个公园有n个景点 公园的管理员准备修建m条道路 并且安排一些形成回路的参观路线 如果一条道路被多条道路公用 那么这条路是冲突的 如果一条道路没在任何一个回路内 那么这条路是不冲突的 问分别有多少条有冲突的路和没有冲突的路 题解 1
  • HTML5 本地裁剪图片并上传至服务器(转)

    很多情况下用户上传的图片都需要经过裁剪 比如头像啊什么的 但以前实现这类需求都很复杂 往往需要先把图片上传到服务器 然后返回给用户 让用户确定裁剪坐标 发送给服务器 服务器裁剪完再返回给用户 来回需要 5 步 步骤繁琐不说 当很多用户上传图
  • wpa_supplicant工具移植

    一 移植准备 就移植来说 wpa supplicant的移植和ssh十分类似 wpa supplicant需要openssl和libnl库 所以我们需要先准备好openssl和libnl库 openssl的移植在前面的文章嵌入式Linux开
  • 【AI安全与隐私论坛】第12期学习笔记——Trustworthy Al: to be Robust or to be Fair

    开设了会议学习系列 主要注重理解专家的科研和讲述逻辑 以及锻炼画概念图流程图的能力 绘图软件 PPT 第12期论坛视频链接 AI安全与隐私论坛第12期 密歇根州立大学汤继良教授 可信人工智能中的鲁棒性和公平性可以兼得吗 文章目录 1 Int
  • 深度学习-第T9周——猫狗识别

    深度学习 第T9周 猫狗识别 深度学习 第T9周 猫狗识别 一 前言 二 我的环境 三 前期工作 1 导入数据集 2 查看图片数目 四 数据预处理 1 加载数据 1 1 设置图片格式 1 2 划分训练集 1 3 划分验证集 1 4 查看标签
  • mysql8.0新特性--隐藏索引

    我们有时候想删除掉冗余索引 但是又怕删除之后影响到查询性能 这时候再回退就需要一定的时间 MySQL8 0开始支持隐藏索引 invisible indexes 隐藏索引不会被优化器使用 如果你想验证某个索引删除之后的查询性能影响 就可以暂时
  • MIPI协议解析——DPI

    在MIPI协议族中 除了DSI 用于显示 CSI 用于摄像头 还有几个概念会经常涉及到 这里把他们提出来说一说 免得有误区 MIPI DPI的全称为Display Pixel interface 是用于主机到显示设备的一种数据传输标准 一般
  • pycharm彻底卸载

    mac中pycharm下载后无法打开 可能是因为使用破解后vm路径改变 完全卸载后再次安装即可 cd Library Preferences rm rf PyCharm2019 x cd Library Logs rm rf PyCharm
  • _T() 和_L() _TEXT __T,L区别与联系详解

    T 和 L TEXT T L区别与联系详解 T 是一个宏 他的作用是让你的程序支持Unicode编码 因为Windows使用两种字符集ANSI和UNICODE 前者就是通常使用的单字节方式 但这种方式处理象中文这样的双字节字符不方便 容易出
  • c++11

    列表 1 boost bind 2 boost function 3 列表初始化 4 nullptr 空指针 6 constexpr函数 6 using类型别名 7 auto类型指示符 8 decltype类型指示符 9 范围for语句 1
  • k8s部署prometheus + grafana

    k8s以Deployment方式部署prometheus grafana 主机说明 系统 ip 角色 cpu 内存 hostname CentOS 7 8 192 168 30 128 master gt 2 gt 2G master1 C
  • 线性回归(Linear Regression)

    引言 说到底 回归任务都是寻找特征与目标之间的关系 我们认为每一个特征或多或少 或积极或消极地对目标产生着影响 我们期望寻找数学表达式来表达出这种影响 一 回归模型 想象一下描述特征与目标之间最简单明了的关系是什么 当然是线性关系了 每个特
  • 解决RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors...CUDA_LAUNCH_BLOCKING=1

    完整报错 RuntimeError CUDA error device side assert triggeredCUDA kernel errors might be asynchronously reported at some oth
  • opencv 中Canny边缘检测算法原理加每一个(分)步骤的代码演示

    1 原理 1 噪声抑制 输入图像经过高斯平滑滤波 减少噪声的影响 2 计算梯度 在平滑后的图像上应用Sobel算子计算梯度幅值和方向 3 非极大值抑制 在梯度方向上 比较每个像素的梯度幅值与其相邻两个像素沿着梯度方向的梯度幅值 如果当前像素