openCV实战-系列教程4:图像梯度计算(Sobel算子/开运算/梯度计算方法/scharr算子/lapkacian算子)、源码解读

news2024/12/31 5:11:13

1、sobel算子

先读进来一个原型白色图

img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

打印结果:

如图有两个3*3的卷积核,其中A是原始图片中的一个3*3的区域,这个A和3*3的卷积核所谓对应位置相乘的结果就分别是左右梯度和上下梯度

假如A是这个矩阵:

 那么Gx的计算结果就为:-x1+x3-2x4+2x6-x7+x9

代码实现就很简单了,直接一行就行:

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

cv_show(sobelx,'sobelx')

dst = cv2.Sobel(src, ddepth, dx, dy, ksize) 

  • src:原始图像
  • ddepth:图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小,就是一个卷积核的大小

打印一个图片可以做出一个函数:

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

 将上面的结果打印出来:

cv_show(sobelx,'sobelx')

 因为我们指定的是dx=1,dy=0,所以只计算了水平方向,很显然只有边界的地方才会有梯度

2、梯度计算方法

安装第1节的计算方法,白色减去黑色结果是正的,黑色减去白色结果就会为负数,而openCV的像素值在0-255,所以会将负数显示为0。如果加上绝对值就可以显示成右边的一圈白色了。

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')

 打印结果:

 同样的方法计算一下上下梯度:

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')

 打印结果:

 分别计算水平方向和竖直方向再打印:

sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

打印结果:

 不建议直接把dx和dy都直接设置成1:

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy) 
cv_show(sobelxy,'sobelxy')

打印结果:

 换一个图做一遍,先打印原图:

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

打印结果:

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

第二行、第四行分别计算sobelx和sobely,第三行、第五行分别取绝对值,第六行最后融合在一起

,打印结果: 

3、scharr算子和lapkacian算子

scharr夏尔

 lapkacian拉普拉斯

scharr算子就是让结果更加敏感一些,lapkacian算子在推导过程使用了二阶导,lapkacian对噪音点会比较敏感,但是对于梯度的计算或者说边缘检测就不是那么友好了,所以lapkacian算子经常和其他方法结合在一起进行使用。

如上图,它不是和其他算子一样,有一个左右和上下的计算,它将目标像素值乘以-4然后加上上下左右的值。因为lapkacian没有分水平和竖直两个方式,所以不需要分开再合并了。

将三种方法都做一遍,放在一起进行比较:

#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')

打印结果:

很明显scharr算子更加敏感一下,计算出了更多的细节和线条 

最后看看原始图长什么样子:

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

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

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

相关文章

阿里云轻量级应用服务器和ECS有什么区别?对比表来了

阿里云轻量应用服务器和云服务器ECS有什么区别?ECS是专业级云服务器,轻量应用服务器是轻量级服务器,轻量服务器使用门槛更低,适合个人开发者或中小企业新手使用,可视化运维,云服务器ECS适合集群类、高可用、…

MySQL进阶篇之Explain执行计划

MySQL:Explain执行计划 使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。 认识explain EXPLAIN SELECT * FROM user_info i LEFT JOIN user_grade g on i.id …

朴素贝叶斯==基于样本特征来预测样本属于的类别y

目录 朴素贝叶斯基于样本特征来预测样本属于的类别y 朴素贝叶斯算法的基本概念与核心思想 假设两个特征维度之间是相互独立的 拉普拉斯平滑增加出现次数保证0不出现 ​编辑 基于样本特征来预测样本属于的类别y 什么是拉普拉斯平滑 朴素贝叶斯基于样本特征来预测样本属于的…

Springboot配置高级

临时属性设置 带属性数启动SpringBoot java –jar springboot.jar –-server.port80携带多个属性启动SpringBoot,属性间使用空格分隔 属性加载优先顺序 参看https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-fea…

Linux学习之vsftpd配置文件

/etc/vsftpd/vsftpd.conf是主要的vsftpd配置文件,主要涉及大的调整,cat /etc/vsftpd/vsftpd.conf | wc -l可以看到有128行内容。 /etc/vsftpd/ftpusers是禁止用户名单,/etc/vsftpd/user_list可以是白名单,也可以是黑名单。 /et…

1268. 搜索推荐系统

链接&#xff1a; 1268. 搜索推荐系统 题解&#xff1a; class Solution { public: struct Trie {Trie() {end false;next.resize(26, nullptr);}bool end;std::set<std::string> words;std::vector<Trie*> next; };void insert_trie(const std::string& w…

Linux共享库基础及实例

共享库是将库函数打包成一个可执行文件&#xff0c;使得其在运行时可以被多个进程共享。 目标库 回顾下构建程序的一种方式&#xff1a; 将每个源文件编译成目标文件&#xff0c;再通过链接器将这些目标文件链接组成一个可执行程序。 gcc -g -c prog.c mod1.c mod2.c gcc -g …

面试热题(复原ip地址)

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011.255.24…

linux/centos zookeeper 使用记录

配置cfg 下载zookeeper-3.4.14.tar.gz负责到centos服务器解压 /xxx/zookeeper-3.4.14/conf/下创建zoo.cfg文件并配置以下属性&#xff0c;/bsoft/zookeeperdata/目录先预先创建 tickTime2000 initLimit10 syncLimit5 dataDir/bsoft/zookeeperdata/ clientPort2181zk启动/重启/关…

使用Nacos与Spring Boot实现配置管理

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

JWT-Token

一、JWT 需要在 HTTP 这种无状态的机制下&#xff0c;记录下&#xff08;标识&#xff09;出来是不是连续&#xff08;逻辑上的连续&#xff09;的请求。 思路&#xff1a;如果多次请求&#xff0c;携带了相同的标识型数据&#xff0c;则认为是逻辑上连续的。这个标识&#xff…

TouchGFX之触摸控制器

必须能够从触摸控制器读取触摸坐标&#xff0c;以便用户与应用程序进行交互。 此处开发的代码将被用于以后开发TouchGFX抽象层。 由于开发板触摸芯片没有连接在I2C接口上&#xff0c;因此本节采用普通IO口模拟I2C接口 1.配置IO口 2.配置定时器 3.编写延时函数 delay.c#include…

算法练习- 其他算法练习5

文章目录 宜居星球改造计划 宜居星球改造计划 yes no na 每个值为一个格子&#xff1b;每天yes的值可以向上下左右扩展一个格子&#xff0c;将no改为yes&#xff1b;矩形区域no是否可以全部转为yes&#xff0c;可以的话需要几天&#xff1f;不可以的话输出-1输入&#xff1a; …

高性能服务器Nodejs业务实战

目录 1 项目初始化1.1 创建项目1.2 配置 cors 跨域1.3 配置解析表单数据的中间件1.4 初始化路由相关的文件夹1.5 初始化用户路由模块1.6 抽离用户路由模块中的处理函数 2 登录注册2.1 新建 ev_users 表2.2 安装并配置 mysql 模块2.3 注册2.4 优化 res.send() 代码2.5 优化表单数…

cuml机器学习GPU库 sklearn升级版AutoDL使用

CUML库 最近在做机器学习任务的时候发现我自己的数据集太大&#xff0c;直接用sklearn 跑起来时间很长&#xff0c;然后问GPT得知了有CUML库&#xff0c;后来去研究了一下&#xff0c;发现这个库只支持linux系统&#xff0c;从官网直接获取下载命令基本上也实现不了最后&#…

自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

设计模式需要用到面向对象的三大特性——封装、继承、多态&#xff08;同名函数具有不同的状态&#xff09; UML类图 eg.—— 描述类之间的关系&#xff08;设计程序之间画类图&#xff09; : public; #: protected; -: private; 下划线: static 属性名:类型&#xff08;默认值…

如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁

如果将PC电脑变成web服务器&#xff1a;利用Nignx反向代理绕过运营商对80端口封锁 在上一篇文章中&#xff0c;我们已经实现了内网主机的多次端口映射&#xff0c;将内网主机的端口映射到了公网&#xff0c;可以通过公网访问该主机了。 因为电信的家庭宽带&#xff0c;默认是…

SpringBoot读取Nacos配置文件

断点到ClientWorker类的getServerConfig方法&#xff0c;反向Debug。

2023-8-23 Trie字符串统计

题目链接&#xff1a;Trie字符串统计 #include <iostream>using namespace std;const int N 100010;int son[N][26], cnt[N],idx;char str[N];void insert(char str[]) {int p 0;for(int i 0; str[i]; i){int u str[i] - a;if(!son[p][u]) son[p][u] idx;p son[p…

Langchain+LLM

LangChain是一个开源框架&#xff0c;允许开发人员在与人工智能&#xff08;AI&#xff09;一起工作时将大型语言模型&#xff08;如GPT4&#xff09;与外部计算和数据源相结合&#xff08;它提供了一套工具、组件和接口&#xff0c;可简化创建由LLM提供支持的应用程序&#xf…