Sobel算子,Scharr算子和Laplacian算子

图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测, 绝大部分可以划分为两类:基于搜索和基于零穿越。
基于搜索:通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值,代表算法是Sobel算子Scharr算子
基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法是Laplacian算子
一、原理
1、Sobel算子Scharr算子
⼀阶导数可以写成两种方式:
在这里插入图片描述
在这里插入图片描述

一阶导可以写成:
在这里插入图片描述
假设要处理的图像为I,在两个⽅向求导:
水平变化: 将图像I与奇数大小的模版进行卷积,结果为Gx。比如,当模板大小为3时,Gx为:在这里插入图片描述
垂直变化: 将图像I与奇数大小的模版进行卷积,结果为Gy。比如,当模板大小为3时,Gy为:
在这里插入图片描述
梯度:
在这里插入图片描述
方向:
在这里插入图片描述
案例:

Sobels = cv2.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderType)
src:传入的图像
ddepth:图像的深度
dx和dy:指求导的阶数,0表示这个方向上没有求导,取值为01。
ksize:是Sobel算子的大小,即卷积核的大小,必须为奇数1357,默认为3。注意:如果ksize=-1,就演变成为3x3的Scharr算子。
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT,

Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。处理完图像后,再使用cv2.convertScaleAbs()函数将其转回原来的uint8格式,否则图像无法显示,
Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted()函数将其组合起来。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']    #定义使其正常显示中文字体黑体
# 1 读取图像
img = cv.imread('./image/dog.jpg',0)
# 2 计算Sobel卷积结果
x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
# 3 将数据进⾏转换
Scale_absX = cv.convertScaleAbs(x) # convert 转换 scale 缩放
Scale_absY = cv.convertScaleAbs(y)
# 4 结果合成
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title("Sobel滤波后结果")
plt.xticks([]), plt.yticks([])
# 保存图像到本地
plt.savefig('Sobel_detection_result.png')  
plt.show()

在这里插入图片描述
注意:当内核大小为3时,以上Sobel内核可能产生比较明显的误差,为解决这一问题,我们使用Scharr函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,其计算方法为:
在这里插入图片描述
将上述代码中计算sobel算子的部分中将ksize设为-1,就是利用Scharr进行边缘检测。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']    #定义使其正常显示中文字体黑体
# 1 读取图像
img = cv.imread('./image/dog.jpg',0)
# 2 计算Sobel卷积结果
x = cv.Sobel(img, cv.CV_16S, 1, 0,ksize = -1)
y = cv.Sobel(img, cv.CV_16S, 0, 1,ksize = -1)
# 3 将数据进⾏转换
Scale_absX = cv.convertScaleAbs(x) # convert 转换 scale 缩放
Scale_absY = cv.convertScaleAbs(y)
# 4 结果合成
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title("Sobel滤波后结果")
plt.xticks([]), plt.yticks([])
# 保存图像到本地
plt.savefig('Scharr_detection_result.png')  
plt.show()

在这里插入图片描述
2、Laplacian算子
Laplacian是利用二阶导数来检测边缘。
二阶导数:
在这里插入图片描述
卷积核为:
在这里插入图片描述
案例:

laplacian = cv2.Laplacian(src,ddepth,dst,ksize,scale,delta,borderType)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 读取图像
img = cv.imread('./image/dog.jpg',0)
# 2 laplacian转换
result = cv.Laplacian(img,cv.CV_16S)
Scale_abs = cv.convertScaleAbs(result)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(Scale_abs,cmap = plt.cm.gray),plt.title("Laplacian检测后结果")
plt.xticks([]), plt.yticks([])
plt.show()
plt.savefig('Laplacian_detection_result.png')

在这里插入图片描述

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

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

相关文章

4.1 数据分析-excel 基本操作

第四节:数据分析-excel 基本操作 课程目标 学会excel 基本操作 课程内容 数据伪造 产生一份招聘数据 import pandas as pd from faker import Faker import random import numpy as np# 创建一个Faker实例,用于生成假数据,指定中文本地…

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单,‌你可以按照以下步骤操作:‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中,‌创建ContextMenuStrip控件的实例,‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…

踩坑记录(序列化与反序列化)

问题描述 实体类中设定字段名称为 sValue和yValue 返回给前段后,变成了svalue,yvalue 字段设置 测试结果:与字段不符,匹配失败 解决方法 在字段上添加JsonProperty("字段名")注解

报告 | 以消费者为中心,消费品零售行业数字化建设持续深化

​2024年是“消费促进年”,国内消费市场稳步复苏。在消费需求多样化、国家政策的推动下,“数字化转型”仍是消费品零售行业的年度主题词,是品牌方获取核心竞争力的必要途径。消费品零售行业的数字化转型重心有所调整,从线上渠道布…

虚拟系统VS

定义 虚拟系统VS(Virtual System)是指将一台物理设备PS(Physical System)虚拟成多个相互隔离的逻辑系统。每个VS独立工作,在业务功能上等同于一台独立的传统物理设备,如图2-1所示。 目的 随着网络规模的不…

macos OneNote 2016 for Mac 官方pkg下载地址 - macos 10.15 Catalion 可用Onenote版本官方下载地址

macos 10.15 Catalion 版本的系统已经无法正常从应用商店下载到可用的Onenote 应用,原因是版本不受支持, 而且onenote官方链接的应用商店地址https://apps.apple.com/us/app/microsoft-onenote/id784801555?mt12在中国地区也无法访问, 所以中国地区用户如果想使用onenote应用…

C语言 | Leetcode C语言题解之第394题字符串解码

题目: 题解: #define N 2000typedef struct {int data[30];;int top; } Stack;void push(Stack *s, int e) { s->data[(s->top)] e; }int pop(Stack *s) { return s->data[--(s->top)]; }//多位数字串转换成int int strToInt(char *s) {cha…

Charles抓包全流程(Mac端+iOS端)

文章目录 与其他抓包软件的对比FiddlerWireShark Charles下载安装及配置Charles抓包实践小结 Charles Proxy是一个广泛使用的网络调试代理工具,它允许开发者监控和分析所有经过计算机的HTTP和SSL/HTTPS网络流量信息。 与其他抓包软件的对比 Fiddler Charles 支持多…

Leetcode3250. 单调数组对的数目 I

Every day a Leetcode 题目来源:3250. 单调数组对的数目 I 解法1:记忆化搜索 题目输入一个数组nums。 假设有两个数组A和B,A递增,B递减,且 Ai Bi numsi ​ 问有多少对(A,B)数组对。 解法: 代码&…

自动回复的客服系统-支持关键词回复或AI智能回复

用户咨询量很大的时候,迫切需要一个自动回复的工具 对于公域流量,非常推荐大家使用网页版在线客服系统,与访客沟通。 既能实现自动回复,又能人工后台即时回复 \/x : llike620

Redis集群搭建以及用idea连接集群

一、redis的集群搭建: 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数,搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

Qt/C++百度地图/高德地图/天地图/腾讯地图/谷歌地图/加载绘图工具栏

一、前言说明 在地图中提供一个绘图工具栏,可以便捷的在地图上添加各种覆盖物,比如折线、多边形、矩形、圆形等,然后可以获取这些覆盖物的路径以及中心点等属性。这里有几个小插曲,比如百度地图gl版本默认不提供这个功能&#xf…

TPH-YOLOv5:基于Transformer预测头的改进YOLOv5,用于无人机捕获场景的目标检测

摘要 提出了TPH-YOLOv5。在YOLOv5的基础上,增加了一个预测头来检测不同尺度的目标。然后用Transformer Prediction Heads(TPH)代替原有的预测头,探索自注意机制的预测潜力。还集成了卷积块注意力模型(CBAM)…

传统CV算法——图像特征算法之斑点检测算法

文章目录 3. 斑点检测3.1 斑点的理解3.1.1 斑点定义3.1.2 斑点检测 3.2斑点检测基本原理3.3LoG计算流程及原理1. 高斯函数2. 拉普拉斯算子3. 组合高斯和平滑4. 计算 LoG4.1. 一阶导数4.2. 二阶导数4.3. 组合二阶导数 5. LoG 的特性6.多尺度检测 3.4 DOG3.4.1 DoG 的基本原理3.4…

Java中调用第三方接口

文章目录 0、测试接口1、JDK的HttpURLConnection2、Apache的HttpClient3、SpringBoot的RestTemplate3.1 GET3.2 POST 4、SpringCloud的Feign5、Hutool的HttpUtil6、失败后重试 0、测试接口 写两个测试接口,一个GET,一个POST RestController RequestMap…

关于IDEA的快捷键不能使用的原因

有时候IDEA的快捷键用不了,这时应该是快捷键发生冲突了,重新设置一下即可。以批量修改变量名称的shift f6为例(我的这个快捷键用不了): 初始的rename的快捷键为shift f6 这个快捷键是冲突的,所以我们需要…

Centos7安装FFmpeg详细步骤(已验证成功)

最近我们需要使用FFmpeg来合成视频功能,这就需要用到服务器必须安装FFmpeg了。 FFmpeg 是一款功能强大的跨平台命令行工具,可以处理各种音频和视频文件,包括转换视频和音频格式、剪辑、合并视频和音频、提取音频、添加字幕、添加水印、调整视…

【Linux跬步积累】—— 环境变量、程序地址空间、进程地址空间、Linux2.6内核进程调度队列

🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮&#xff0…

什么?!新版 Node.js V22.5 自带 SQLite 模块啦

前言 2024年7月,Node.js V22.5.0 版本发布,自带了 SQLite 模块,意味着开发者可以直接在程序中使用 SQLite 数据库,而无需引入第三方库👍。 话不多说,感觉来体验一波✈。 安装/升级 我现在用的是21.4.0版…

Trm理论 3(ELMo)

LSTM模型 如图,LSTM模型是rnn模型的改良版,通过ft来选择性的保留上一次得到的信息 ELMo模型(双向LSTM) ELMo模型是对word2vec的改良,改良了word2vec的二义性 对比上下两图,可以发现,WE对预测…