Canny边缘检测算法

news2024/12/27 12:30:39

文章目录

  • 前言
    • 1、Canny边缘检测算法
    • 2、代码1
      • 函数
    • 3、代码2
    • 4、基于tensor数据的代码


前言

最近在向卷积神经网络里的数据预处理和数据增强部分加这个函数,记录一下。


1、Canny边缘检测算法

Canny边缘检测算法是一种经典的边缘检测算法,其基本原理如下:

  1. 噪声去除:首先,使用高斯滤波器降噪,以平滑图像。

为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。
在这里插入图片描述
其中Sigma为方差,k确定核矩阵的维数。高斯卷积核大小的选择将影响Canny检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。一般选取5x5。

  1. 梯度计算:然后,使用Sobel算子计算图像的梯度强度和方向。梯度方向垂直于边缘,因此它可以用来定位边缘。
    在这里插入图片描述

  2. 非极大值抑制:在此步骤中,将梯度强度图像中的所有像素转换为它们在局部最大方向上的梯度强度,以消除边缘宽度。

非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0。
将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

  1. 双阈值检测:使用双阈值检测来确定哪些边缘是真实的边缘。如果像素的梯度强度大于高阈值,则将其视为边缘像素。如果像素的梯度强度小于低阈值,则其被排除在边缘之外。如果像素的梯度强度在两个阈值之间,则只有当该像素与高梯度强度像素相连时,才将其视为边缘像素。

  2. 边缘跟踪:最后,使用边缘跟踪算法来连接所有真实的边缘像素,以形成完整的边缘。

Canny算法多用于图像处理、计算机视觉和机器人等领域。

2、代码1

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

'''canny边缘提取'''

def canny_demo(image):
    # 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
    blur=cv.GaussianBlur(image,(7,7),0)
    #2.灰度处理
    gray=cv.cvtColor(blur,cv.COLOR_BGR2GRAY)
    #3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
    grad_x=cv.Sobel(gray,cv.CV_16SC1,1,0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
    #4.求边缘
    edge_output=cv.Canny(grad_x,grad_y,50,150)#参数:x梯度,y梯度 ,低阈值,高阈值

    #cv.imshow('canny-demo',edge_output)
    dst=cv.bitwise_and(image,image,mask=edge_output)
    #cv.imshow('color edge',dst)
    return dst


img=cv.imread(r"D:/code/data/319.jpg")
print(img.shape)
cv.imshow('origin',img)
dst = canny_demo(img)
cv.imshow('dst',dst)
cv.waitKey(0)

print(dst.shape)

裂缝提取

函数

def Canny(image):
    # 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
    blur = cv.GaussianBlur(image, (7, 7), 0)
    # 2.灰度处理
    gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
    # 3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
    grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
    # 4.求边缘
    edge_output = cv.Canny(grad_x, grad_y, 50, 150)  # 参数:x梯度,y梯度 ,低阈值,高阈值

    dst = cv.bitwise_and(image, image, mask=edge_output)
    return dst

3、代码2

import cv2
import numpy as np

Type = 0   # 阈值处理方式
Value = 0  # 使用的阈值
T = 0
V = 0
def onType(a):
    Type = cv2.getTrackbarPos(tType, windowName)
    Value = cv2.getTrackbarPos(tValue, windowName)
    ret, dst = cv2.threshold(o, Value, 255, Type)
    cv2.imshow(windowName, dst)
    global T
    T = Type


def onValue(a):
    Type = cv2.getTrackbarPos(tType, windowName)
    Value = cv2.getTrackbarPos(tValue, windowName)
    ret, dst = cv2.threshold(o, Value, 255, Type)
    cv2.imshow(windowName, dst)
    global V
    V = Value

o = cv2.imread(r"D:/code/data/319.jpg")
# 灰度转换
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', gray)
windowName = 'output'
cv2.namedWindow(windowName)
cv2.imshow(windowName, gray)
# 构建滚动条
tType = 'Type'
tValue = 'tValue'
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName, 0, 255, onValue)
while 1:
    k = 0xFF & cv2.waitKey(1)
    if k == 27:
        break
    elif k == ord('s'):
        realType = T
        realValue = V
        retval, img = cv2.threshold(gray, realValue, 255, realType)
        cv2.imshow('output.jpg', img)
        cv2.imwrite("D:/code/data/output.jpg", img)
        output = cv2.imread("D:/code/data/output.jpg")
        print(output.shape)
        # 高斯滤波平滑处理
        gauss = cv2.GaussianBlur(output, (3, 3), 0, 0)
        # cv2.imshow('gauss',gauss)
        # 滤波除噪
        k = np.ones((5, 5), np.uint8)
        _open = cv2.morphologyEx(gauss, cv2.MORPH_OPEN, k)
        _close = cv2.morphologyEx(_open, cv2.MORPH_CLOSE, k)
        cv2.imshow('_close', _close)
        cv2.imwrite("D:/code/data/output2.jpg", _close)
cv2.destroyAllWindows()

4、基于tensor数据的代码

这个我还没找到。


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

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

相关文章

榜单!直接式TPMS前装搭载率突破60%,哪些厂商在领跑

2016年,《乘用车轮胎气压监测系统的性能要求和试验方法》通过强制性国家标准技术审查;根据规定,自2020年1月1日起,所有中国市场在产乘用车将开始实施强制安装TPMS(胎压监测系统)的要求。 目前,…

vue项目前端解决跨域问题

在前后端分离项目中,跨域是一定会出现的问题,本文主要介绍跨域问题的解决思路,以及在vue项目中如何使用代理的方式在前端解决跨域问题,同时提供一个后段解决的方案。 1、产生原因 跨域问题产生的原因是浏览器的同源策略。浏览器同…

哪款蓝牙耳机便宜又好用?2023公认质量最好的蓝牙耳机推荐

哪款蓝牙耳机便宜又好用?现如今,市面上的蓝牙耳机越来越多,在选择增多的同时也有着不小的困惑,不知道哪款好用。针对这个问题,我来给大家推荐几款质量最好的蓝牙耳机,一起来看看吧。 一、南卡小音舱Lite2蓝…

安装kali虚拟机

1:kali是什么? kali 是由 Offensive Security 公司开发和维护的。它在安全领域是一家知名的、值得信赖的公司它甚至还有一些受人尊敬的认证,来对安全从业人员做资格认证。Kali 也是一个简便的安全解决方案。Kali 并不要求你自己去维护一个 Linux 系统&…

u盘中病毒文件被隐藏怎么恢复?看看这三种方法

U盘是我们日常生活中常用的存储设备,但是如果U盘被病毒感染,可能会导致文件被隐藏或丢失。被病毒隐藏的U盘文件给我们的生活、工作带来了很大的麻烦,因此必须马上采取行动来恢复这些文件。 而解决“u盘文件被病毒隐藏如何恢复正常”的问题原来…

SpringBoot【运维实用篇】---- 日志

SpringBoot【运维实用篇】---- 日志 1. 代码中使用日志工具记录日志教你一招:优化日志对象创建代码 2. 日志输出格式控制3. 日志文件 运维篇最后一部分我们来聊聊日志,日志大家不陌生,简单介绍一下。日志其实就是记录程序日常运行的信息&…

网络安全是一个好的专业吗?

近年我国《网络安全法》政策持续落地,前段时间国家工信部出台意见,加强数据安全、网络安全、功能安全等管理、智能网联汽车安全是关键。针对上次滴滴安全安全审查一事当中,国家网信办强调企业无论在哪上市必须确保国家网络安全安全及关键信息…

UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统?

​ UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统? 关于 ABB 类别 什么是 ABB 分布式控制系统? ABB 的分布式控制系统 (DCS) 旨在改变多方面、全天候 24 小时的工业流程。ABB 的控制架构持续分析和推动工厂生产力,最大限度地提高资产…

Mysql数据库的存储引擎——必看教程

目录 一、什么是存储引擎 二、MySQL支持的存储引擎 三、常见的存储引擎 1.InnoDB存储引擎 2.MyISAM存储引擎 3.MEMORY存储引擎 四、选择存储引擎 总结 ✨✨✨大家好,我是会飞的鱼-blog,今天我来给大家介绍一下Mysql,有不足之处&#xf…

从 Windows 10/11、7/8 上清空回收站后恢复已删除文件的 6 种方法

Windows(包括 Windows 11、10、8、7 和 Vista)上的回收站用于回收您打算删除的不需要的文件。如果您删除了一些重要的文件或文件夹并且不小心清空了回收站,您仍然有机会恢复从回收站中删除的文件。这是一个教程,将阐明“如何在清空…

机器学习 day11(决策边界,损失函数)

逻辑回归模型的预测过程 通常来说,我们先选择一个阈值0.5,当f(x) > 0.5时,则预测y为1,当f(x)<0.5时,则预测y为0。由此我们可以得出,当阈值取0.5时,g(z)取0.5,z取0。…

想回西安

五一假期结束了,开始营业总结下跟读者们的交流。 特别感谢大家让我在自己的技术号里面写一些和生活相关的事情,现在正常营业,回复下读者的问题。 问题 发哥,我现在有个疑惑能麻烦帮我解答下嘛。 我已经工作一年多了,但…

这就是实力~ 腾讯云大咖亲码 “redis深度笔记” 无废话全精华

前言 作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis,像亚马逊、谷歌、阿里、腾讯都要…

网络安全 | Linux ELF病毒实例

本节将编写一个病毒原型,本病毒原型主要由C语言编写,少部分无法由C语言来完成的底层操作采取GCC内嵌汇编的方式实现。 01、原型病毒实现 现在开始介绍实现的细节,提供原型病毒的伪代码以及流程图,并介绍编译感染过程。以实践的方式…

软件开发全文档下载(史上最详细版)

写在前面 在日常项目开发过程中,会产生大量的过程文档,比如开发过程中的文档、管理过程中的文档、产品相关文档等等,那这些文档我们日常怎么去管理呢?怎么去做规划呢?如何做成通用标准呢?小编特地整理了一…

​ 1、Promise 、axios 、async和await

1.0 同步与异步 【了解】 同步: 具有阻塞性 异步: 异步代码同时执行,谁跑的快谁就先执行完,异步与同步相遇,先让同步执行完毕后再执行异步代码 异步分类:(执行完成时间不确定或代码执行时间过长) 定时器 …

FPGA设计中锁存器产生、避免与消除

FPGA设计中锁存器产生、避免与消除 一、锁存器的产生1.1 组合逻辑中使用保持状态1.2 组合逻辑中的if-else语句或case语句未列出所有可能性1.3 小结 二、锁存器的避免三、锁存器的消除3.1 情况一 一、锁存器的产生 锁存器的产生主要有以下两种情况:(1&…

【模拟IC学习笔记】 电流偏置的设计

电流偏置、电压偏置 电压偏置: 1、对走线电阻引起的IR压降敏感 2、对噪声干扰敏感 3、器件相隔较远,匹配较差 电流偏置: 1、对走线电阻引起的IR压降不敏感 2、抗干扰能力强 3、需要匹配的器件可以放在一起,匹配更好。 模…

一文打通java中内存泄露

目录 前置知识 内存泄漏(memory leak) 内存溢出(out of memory) Java中内存泄露的8种情况 静态集合类 单例模式 内部类持有外部类 各种连接,如数据库连接、网络连接和IO连接等 变量不合理的作用域 改变哈希值 …

USB2.0(一):基础

一、总线标准 USB1.1:支持12Mbps全速率(FullSpeed)和1.5Mbps低速率( HalfSpeed)USB2.0:支持480Mbps高速率(High Speed),兼容1.1USB3.0:支持5Gbps超高速率&am…