图像数据处理21

news2024/11/13 8:56:03

五、边缘检测

5.2基于二阶导数的边缘检测

一阶导数(如Sobel、Prewitt算子)能够捕捉到灰度值的快速变化,但有时会因检测到过多的边缘点而导致边缘线过粗。为了更加精确地定位边缘位置,可以利用二阶导数的零交叉点。零交叉点是是函数二阶导数为零(正负变换)的点。

高斯拉普拉斯算子是一种用于图像边缘检测的算法。它先对图像进行高斯平滑处理,然后计算拉普拉斯算子,以找到图像中的零交叉点,从而实现图像边缘位置的检测。

其的优点有

①抗噪声能力强:LoG算子结合了高斯平滑和拉普拉斯锐化的优点。高斯平滑能够有效地抑制图像中的噪声,减少噪声对边缘检测的影响。这使得LoG算子在处理含有噪声的图像时,能够更准确地检测出边缘,防止因噪声而出现伪边缘检测。

②可调整性强:LoG算子中的高斯核标准差(σ)是一个可调整的参数,通过改变σ的值,可以控制高斯平滑的程度,适应不同噪声水平和边缘特性的图像,进而优化缘检测的效果。

def apply_log(image, sigma):
    """
    应用高斯拉普拉斯算子进行边缘检测。

    参数:
    image: 输入图像
    sigma: 高斯核的标准差,用于平滑图像

    返回:
    edges: 检测到的边缘图像
    """
    # 使用高斯模糊平滑图像
    blurred_image = cv2.GaussianBlur(image, (0, 0), sigma)

    # 计算拉普拉斯算子
    laplacian_image = cv2.Laplacian(blurred_image, cv2.CV_64F)

    # 将拉普拉斯图像的数据类型转换为8位无符号整数
    laplacian_image = np.uint8(np.absolute(laplacian_image))

    # 找到零交叉点作为边缘
    # 使用阈值来近似找到零交叉点
    _, edges = cv2.threshold(laplacian_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    return edges


# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)

# 缩小原图
resized_image = cv2.resize(image, None, fx=0.4, fy=0.4)

# 应用LoG算子
edges = apply_log(resized_image, sigma=1.5)

# 缩小边缘图像(确保使用与原图相同的缩放因子)
resized_edges = cv2.resize(edges, (resized_image.shape[1], resized_image.shape[0]))

# 将原图和处理后的图像水平堆叠
stacked_image = np.hstack((resized_image, resized_edges))

# 显示结果
cv2.imshow('Original and Edges', stacked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3 Canny边缘检测算子

5.3.1Canny边缘检测算子概念:Canny算法是应用于边缘检测的标准算法,其目标是找到一个最优的边缘检测解,即尽可能多地标识出图像中的实际边缘,同时使标识出的边缘尽可能接近实际边缘,并尽可能减少噪声对边缘检测结果的干扰。

5.3.2原理及步骤:

①图像平滑:使用高斯滤波器对原始图像进行平滑处理,减少图像噪声。高斯滤波器通过加权平均周围像素的值来模糊图像,降低噪声的影响。

②梯度计算:计算平滑后图像的梯度幅度和方向。通常使用Sobel算子、Prewitt算子等来计算图像在水平和垂直方向上的梯度值,从而得到每个像素点的梯度大小和方向。

③非极大值抑制:在梯度图像上,对每个像素点在其梯度方向上进行比较,并保留局部最大值点,抑制非边缘像素。从而细化边缘线条,减少边缘的宽度。 

④双阈值检测:设定高阈值和低阈值,梯度值大于高阈值的一定是边缘;梯度值小于低阈值的一定不是边缘,要是介于高阙值和低阙值之间,就要根据其的邻接像素做出判断。

⑤边缘连接:从强边缘像素开始,沿着梯度方向追踪并连接相邻的弱边缘像素,从而形成完整的边缘。

import cv2
import numpy as np

# 读取图片
image = cv2.imread('fu.jpg')

# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用高斯模糊
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)

# 使用Canny算子进行边缘检测
low_threshold = 50
high_threshold = 150
edges = cv2.Canny(blurred_image, low_threshold, high_threshold)

# 获取原始图像和边缘检测图像的尺寸
height, width = image.shape[:2]
edges_height, edges_width = edges.shape[:2]

# 将图像缩小一半
resized_image = cv2.resize(image, (width // 2, height // 2))
resized_edges = cv2.resize(edges, (edges_width // 2, edges_height // 2))

# 显示原图和边缘检测结果
cv2.imshow('Original Image', resized_image)
cv2.imshow('Edges', resized_edges)

# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。

本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。

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

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

相关文章

触想工业一体机辅助DR系统提升医学影像诊断效率

一、行业发展背景 早期X线摄影依赖胶片成像,不便于图像存储管理,且显影过程长,无法进行后期处理,诊断质量和效率受到局限。 随着数字化技术的发展,DR系统问世,利用平板探测器将X射线图像转化为数字信号&…

推荐一款功能全面的层次化笔记应用,支持自由拖拽、缩放、旋转,可视化非常牛逼(附源码)

背景 不知道各位大佬日常生活中笔记软件用的多不,小编在工作中常常用笔记来记录每天的收获和安排。笔记软件的好坏直接影响了工作的心情和效率。今天给大家介绍的这款笔记软件,以其强大的笔记功能为基础,创造性地融入了画布式的自由编辑特性…

关于武汉芯景科技有限公司的RS232通信接口芯片XJ3243EEUI开发指南(兼容MAX3243EEUI)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、典型应用电路 三、功能描述 1.Transmitter 通过T1,T2可以将TTL电平转换为RS232电平 2.Receiver 通过R1,R2可以将RS232电平转换为TTL电平 3.工作模式控制 4.INVALID引脚

EDKII之安全启动详细介绍

文章目录 安全启动简介安全启动流程介绍签名过程BIOS实现小结 安全启动简介 安全启动(Secure Boot)是一种计算机系统的安全功能,旨在确保系统启动过程中只能加载经过数字签名的受信任的操作系统和启动加载程序。通过使用安全启动&#xff0c…

数据结构之串与KMP算法详解

串 一. 定义(了解) 串,即字符串,是计算机系统和网络传输中最常用的数据类型,任何非数值型的处理都会以字符串的形式存储和使用。 串(String)是由零个或多个字符组成的有限序列,一…

多选类型项,点击亮或不亮

用于菜单下拉 多选项 。 <div style"display: flex; flex-wrap: wrap;margin: 0 auto;"><div v-for"(item, index) in prpductnames" :key"item.id"><span :class"{ selected: selectArr.includes(item.id) }" click&q…

《计算机操作系统》(第4版)第7章 文件管理 复习笔记

第7章 文件管理 一、文件和文件系统 1. 数据项、记录和文件 数据组成可分为数据项、记录和文件三级&#xff0c;它们之间的层次关系如图7-1所示。 图7-1 文件、记录和数据项之间的层次关系 (1)数据项 在文件系统中&#xff0c;数据项是最低级的数据组织形式&#xff0c;可以分为…

Grove Vision AI V2之GPIO

一、说明 实现一个LED闪烁的Demo&#xff0c;Grove Vision AI V2开发板上有一个USER_LED&#xff0c;由GPIO SEN_D2驱动&#xff0c;SEN_D2为高电平是USER_LED亮&#xff0c;SEN_D2为低电平时USER_LED灭。 USER_LED部分电路如下&#xff1a; 二、创建例程 1、创建文件 在See…

MySQL的源码安装及基本部署(基于RHEL7.9)

这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…

上线eleme项目

&#xff08;一&#xff09;搭建主从从数据库 主服务器master 首先下载mysql57安装包&#xff0c;然后解压 复制改目录到/usr/local底下并且改个名字 cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql 删掉/etc/my.cnf 这个会影响mysql57的启动 rm -rf /etc…

浪潮服务器主板集成RAID常见问题

★主板集成RAID出现Initialize初始化&#xff0c;如下图 判断及解决方案&#xff1a; 1.机器是否有过插拔硬盘等操作。 2.系统初始化-系统启动会非常的慢。一般为非法关机或者断电导致。 3.出现此情况耐心等待磁盘初始化完成即可。系统初始化时间以具体的数据大小来决定&#…

CLion IDE用MSVC和cmake编译darknet(带GPU)

这个配置教程给用过pytorch&#xff0c;懂得深度学习代码的基本流程&#xff0c;但又不熟悉windows c开发环境的宝子们使用。 安装CUDA&#xff0c;CUDNN 一般都有&#xff0c;不说了。注意上nvidia官网看一下显卡架构&#xff0c;后面要用&#xff0c;比如我的丽台M2000架构…

从零开始Dify本地部署|Windows

参考官方文档部署 Dify本地源码启动 windows最好结合WSL使用&#xff0c;懒得配置WSL&#xff0c;就是硬肝&#xff01; 1.Clone Dify 代码 先找到项目GitHub 开源链接clone 下来&#xff0c;使用docker部署运行&#xff08;Windows配置docker环境这里不赘述&#xff09; gi…

Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录 一、部署alertmanager相关组件1.alertmanager-config2.alertmanager-message-tmpl3.alertmanager 二、调试邮件告警三、钉钉群/企业微信群 报警3.1添加钉钉群机器人3.2添加企业微信群机器人3.3部署alertmanager-webhook-adaptermessage-tmplalertmanager-webhook-adap…

Windows环境下,使用bat脚本配置本地域名解析(含新增、修改、清理)

适用场景&#xff1a; 1.内部不存在DNS服务器的客户&#xff1b; 2.客户电脑不知道前期是否过某域名的本地解析。 整体思路&#xff1a; 1.备份原始hosts配置文件&#xff1b; 2.将hosts配置文件中包含xxxxxxxxxx.com域名的解析清空&#xff1b; 3.写入正确的解析到hosts配置文…

发布MindSearch到ModelScope创空间

一、创建空间 1.点击【我要创建】来创建一个应用 2.填写完基础信息 会出现一个未发布的应用 二、上传代码 1.参照当前页的指示一步一步将MindSearch部署需要的文件上传到指定的repo即可 2.在当前页点击【空间文件】查看刚才通过命令上传的文件 三、上线应用 1.点击【设置】可…

【论文阅读】A Closer Look at Parameter-Efficient Tuning in Diffusion Models

Abstract 大规模扩散模型功能强大&#xff0c;但微调定制这些模型&#xff0c;内存和时间效率都很低。 本文通过向大规模扩散模型中插入小的学习器(称为adapters)&#xff0c;实现有效的参数微调。 特别地&#xff0c;将适配器的设计空间分解为输入位置、输出位置、函数形式的…

什么是ConcurrentHashMap?实现原理是什么?

什么是ConcurrentHashMap&#xff1f;实现原理是什么&#xff1f; 在多线程环境下&#xff0c;使用HashMap进行put操作时存在丢失数据的情况&#xff0c;为了避免这种bug的隐患&#xff0c;强烈建议使用ConcurrentHashMap代替HashMap。 HashTable是一个线程安全的类&#xff…

HashMap是线程安全的吗?为什么呢?

HashMap是线程安全的吗&#xff1f;为什么呢&#xff1f; HashMap是线程不安全的&#xff01; 线程不安全体现在JDK.1.7时在多线程的情况下扩容可能会出现死循环或数据丢失的情况&#xff0c;主要是在于扩容的transfer方法采用的头插法&#xff0c;头插法会把链表的顺序给颠倒…

【亲测有效】JS Uncaught TypeError: [function] is not a constructor

【亲测有效】JS Uncaught TypeError: [function] is not a constructor 在JavaScript编程中&#xff0c;Uncaught TypeError: [function] is not a constructor 是一个相对常见的错误&#xff0c;通常发生在尝试使用某个值作为构造函数&#xff0c;但实际上它不是构造函数的情况…