【OpenCV-图像梯度】Scharr算子和laplacian算子

news2024/11/23 2:47:53

1 图像梯度-Sobel算子

在这里插入图片描述

import cv2  # 导入 OpenCV 库

# 读取灰度图像
img = cv2.imread('./img/pie.png', cv2.IMREAD_GRAYSCALE)  # 使用 imread 函数读取图像文件,路径为 './img/pie.png'
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像

# 显示图像
cv2.imshow("img", img)  # 使用 imshow 函数显示图像,窗口标题为 'img'

# 等待用户按键
cv2.waitKey()  # 等待用户按键事件,参数为空表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
# 计算图像的 x 方向梯度
# cv2.Sobel() 函数用于计算图像的梯度,用于边缘检测等图像处理任务

# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 1 表示在 x 方向计算梯度(dx=1),0 表示在 y 方向不计算梯度(dy=0)
# ksize=3 表示使用 3x3 的 Sobel 内核来计算梯度

# 计算 x 方向的梯度,只涉及垂直方向的边缘
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)


cv_show(sobelx,'sobelx')

在这里插入图片描述
白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值

# 计算图像的 x 方向梯度
# cv2.Sobel() 函数用于计算图像的梯度,用于边缘检测等图像处理任务

# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 1 表示在 x 方向计算梯度(dx=1),0 表示在 y 方向不计算梯度(dy=0)
# ksize=3 表示使用 3x3 的 Sobel 内核来计算梯度

# 计算 x 方向的梯度,只涉及垂直方向的边缘
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)

# 将 Sobel 运算结果转换为绝对值图像
# cv2.convertScaleAbs() 函数用于转换图像数据类型,并将图像数据的绝对值转换为 8 位无符号整数

# sobelx 是之前计算得到的 x 方向梯度图像,数据类型为 64 位浮点型
# 使用 cv2.convertScaleAbs() 函数将其转换为 8 位无符号整数类型,并取绝对值
# 这个操作可以将浮点型图像转换为更适合显示和进一步处理的 8 位图像
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')

在这里插入图片描述

分别计算x和y,再求和

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 假设 sobelx 和 sobely 是已经计算好的 Sobel 处理图像
# 使用加权和操作合并 Sobel x 和 y 方向的梯度图像
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# 参数解释:
# sobelx:Sobel x 方向的梯度图像
# sobely:Sobel y 方向的梯度图像
# 0.5:sobelx 图像的权重
# 0.5:sobely 图像的权重
# 0:加权和操作的标量值(通常用于调整亮度)

# 显示加权和处理后的图像
cv_show(sobelxy, 'sobelxy')  # 使用自定义的 cv_show 函数显示图像,窗口标题为 'sobelxy'

在这里插入图片描述

1.1 分开计算

# 分开计算
import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 读取灰度图像
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像

# 计算 Sobel x 方向的梯度
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 1:计算 x 方向的梯度
# 0:不计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3

# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobelx = cv2.convertScaleAbs(sobelx)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型
# 这个步骤是为了将浮点数图像转换为可以显示的格式

# 计算 Sobel y 方向的梯度
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 0:不计算 x 方向的梯度
# 1:计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3

# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobely = cv2.convertScaleAbs(sobely)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型

# 合成 x 和 y 方向的 Sobel 图像
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# cv2.addWeighted:对两个图像进行加权和操作
# sobelx:x 方向的 Sobel 图像
# sobely:y 方向的 Sobel 图像
# 0.5:sobelx 图像的权重
# 0.5:sobely 图像的权重
# 0:加权和操作的标量值(通常用于调整亮度)

# 显示合成后的图像
cv_show(sobelxy, 'sobelxy')
# 假设 cv_show 是自定义的显示图像的函数
# 如果没有定义,使用 cv2.imshow 来显示图像:
# cv2.imshow('sobelxy', sobelxy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

在这里插入图片描述

1.2 整体计算

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作

# 读取灰度图像
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像

# 计算 Sobel 边缘检测图像,计算 x 和 y 方向的梯度
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 1:计算 x 方向的梯度
# 1:计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3

# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobelxy = cv2.convertScaleAbs(sobelxy)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型
# 这个步骤是为了将浮点数图像转换为可以显示的格式

# 显示加权和处理后的图像
cv_show(sobelxy, 'sobelxy')
# 假设 cv_show 是自定义的显示图像的函数
# 如果没有定义,使用 cv2.imshow 来显示图像:
# cv2.imshow('sobelxy', sobelxy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

在这里插入图片描述

2 图像梯度-Scharr算子-laplacian算子

在这里插入图片描述

#不同算子的差异
img = cv2.imread('./img/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) 

# 计算图像的拉普拉斯梯度
# cv2.Laplacian() 函数用于计算图像的二阶导数(拉普拉斯算子),用于边缘检测和细节增强

# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 拉普拉斯算子用于计算图像的二阶导数,可以突出显示图像中的边缘和细节
laplacian = cv2.Laplacian(img, cv2.CV_64F)

laplacian = cv2.convertScaleAbs(laplacian)   

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

在这里插入图片描述

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

在这里插入图片描述

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

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

相关文章

Muduo库介绍及使用

文章目录 MuduoMuduo库是什么Moduo 库的原理Muduo 库常见接口TcpServer类EventLoop类TcpConnection类TcpClient类Buffer类 Muduo库实现一个简单英译汉服务器和客⼾端 Muduo Muduo库是什么 Muduo由陈硕⼤佬开发,是⼀个基于⾮阻塞IO和事件驱动的C⾼并发TCP⽹络编程库…

SpringSecurity原理解析(三):请求流转过程

1、当web系统启动的时候SpringSecurity做了哪些事情? 当web系统启动的时候会加载WEB-INF下的web.xml文件,在web.xml主要配置了下边几块的 内容,分别是: 1)加载classpath路径下的配置文件(包括SpringSecurit…

开关电源自动化测试有哪些流程和步骤?-天宇微纳

开关电源自动化测试的总体流程包括测试前的准备、测试过程中的具体步骤和测试后的数据处理三大部分。 以纳米软件ATECLOUD平台测试为例: ‌测试前的准备‌ ‌连接设备和仪器‌:通过LAN通讯总线、测试夹具以及其它线缆将需要测试的电源模块连接到纳米服…

【C语言】指针深入讲解(下)

目录 前言回调函数回调函数的概念回调函数的使用 qsort函数的使用和模拟实现qsort函数的介绍qsort函数的使用qsort函数模拟实现 前言 今天我们来学习指针最后一个知识点回调函数,这个知识点也很重要,希望大家能坚持学习下去。 没学习之前指针知识内容的…

k8s的配置管理

一、配置管理分为两种: 1. 加密配置:用来保存密码和token密钥对以及其它敏感的k8s资源。 2.应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中的容器。 二、加密配置 1.secret三种类型&#xf…

WPS取消首字母自动大写

WPS Office(12.1.0.17827) ① 点击文件,在文件中找到选项 ② 选择编辑,取消勾选

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方…

计算机为啥选中二进制?

坊间传闻,当年,彷徨少年computer有幸读到东方奇书《道德经》中一段:“道生一,一生二,二生三,三生万物。”忽然灵光乍现,做五体投地状。“啊门、主啊,我get到了,狗屁二生三…

「滚雪球学MyBatis」教程导航帖(已完结)

写在前面 我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息,现整理如下: 功能描述:获取淘宝搜索页面的信息,提取其中的商品名称和价格 探讨:淘宝的搜索接口 翻页的处理 技术路线:requests‐…

随身WiFi大揭秘!9毛3000G?坑你没商量!博主亲测,教你如何避坑!

随身WiFi老坑人?流量收费坑?网速坑?今天本博主重金自费入购7款随身WiFi测评,这份避坑指南请您收好了! 随身WiFi多吓人啊,一块9毛钱3000个G,还有的是5块9毛钱3000个G,确实有3000个G&…

同样数据源走RTMP播放延迟低还是RTSP低?

背景 在比较同一个数据源,是RTMP播放延迟低还是RTSP延迟低之前,我们先看看RTMP和RTSP的区别,我们知道,RTMP(Real-Time Messaging Protocol)和RTSP(Real Time Streaming Protocol)是…

京东鸿蒙上线前瞻——使用 Taro 打造高性能原生应用

背景 2024 年 1 月,京东正式启动鸿蒙原生应用开发,基于 HarmonyOS NEXT 的全场景、原生智能、原生安全等优势特性,为消费者打造更流畅、更智能、更安全的购物体验。同年 6 月,京东鸿蒙原生应用尝鲜版上架华为应用市场&#xff0c…

C++ 多态学习笔记(下)

开始新的学习之前,我们先通过一段涉及继承、多态的 代码来回忆、加深理解。 Animal作为基类,我们要给每种动物实例化出sound()的模块,因为Animal在实际意义上没什么好实例化的,所以设计成抽象类。 class Animal { public:virtua…

又考了两个Oracle认证:RAC和DataGuard,文末送资料

号主姚远目前已经拥有Oracle的认证超过20个了,最近又考了两个Oracle 19c的认证,是RAC和DataGuard。其实内容和12c没有太大的区别,但题目依然很难,很多选项模拟两可,需要对相关概念非常清楚才能通过考试。姚远的运气不错…

Linux网络:应用层协议http/https

认识URL URL是我们平时说的网址 eg:http常见的URL http://user:passwww.example.jp:80/dir/index.htm?uid1#ch1 注意: 服务器地址就是域名,相当于服务器ip地址 像http服务绑定80端口号,https服务绑定443端口。ssh服务端口绑定…

EasyCVR无法启动并报错“error while loading shared libraries”,如何解决?

安防监控/视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作,用户可以轻松地进行远程视频监控、存储和查看,满足…

Python操作ES集群API(增删改查等)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记: 最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—Elastic…

Vue组件:插槽的使用

在实际开发中,子组件往往只提供基本的交互功能,而内容是有父组件来提供的。为此,Vue.js 提供了一种混合父组件内容和子组件模板的方式,这种方式称为内容分发。 1、基本用法 Vue.js 参照当前 Web Components 规范草案实现了一套内…

和 InternLM 解锁“谁是卧底”新玩法

本文来自社区投稿,作者LangGPT联合发起人、东北大学在读博士生王明 在大模型技术日益普及的今天,AI 的应用已经渗透到各个领域,带来了无数创新和乐趣。今天,我们将一起探索如何搭建一个 AI 版的“谁是卧底”游戏。通过 InternStud…