Sobel(索贝尔),Scharr(沙尔)和Laplacian(拉普拉斯)算子——python实现
文章目录
- 1.Sobel(索贝尔)(高斯):通过对X,Y方向求梯度
- 2.具体实现原理过程
- 3.代码实战
- 2.Scharr(沙尔算子)算子
- 3.拉普拉斯算子
1.Sobel(索贝尔)(高斯):通过对X,Y方向求梯度
(1)首先求解X方向的导;
(2)再求Y方向的导;
(3)最终结果:|G|=|Gx|+|Gy|;
2.具体实现原理过程
(1)如果对X方向求梯度,使用如下面这样的卷积核
对图像中的像素值进行卷积(点乘):
(2)如果对Y方向求梯度,使用如下面这样的卷积核
对图像中的像素值进行卷积(点乘):
3.代码实战
import os
import cv2
import numpy as npdef SobelFilter(img_path='images/chess.png'):img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(450,450))img_dy=cv2.Sobel(src=img,ddepth=-1,dx=1,dy=0,ksize=5)img_dx=cv2.Sobel(src=img,ddepth=-1,dx=0,dy=1,ksize=5)img_dx_dy=img_dx+img_dy# img_dx_dy=cv2.add(img_dx,img_dy)cv2.imshow('img_src',img_src)cv2.imshow('img_dx',img_dx)cv2.imshow('img_dy',img_dy)cv2.imshow('img_dx_dy',img_dx_dy)cv2.waitKey(0)cv2.destroyAllWindows()def detectSobelFilter():cap=cv2.VideoCapture(0)while cap.isOpened():OK,frame=cap.read()if OK:img = cv2.resize(src=frame, dsize=(450, 450))img_dy = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)img_dx = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5)img_dx_dy = img_dx + img_dycv2.imshow('object',img_dx_dy)else:print('为检测到物体')if cv2.waitKey(1)&0XFF==27:breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')SobelFilter()# detectSobelFilter()
对下面这张图分别进行X和Y方向求梯度进行测试:
实时测试:
2.Scharr(沙尔算子)算子
(1)与索贝尔不同的是kernel的值不同,沙尔只支持kernel(3,3),所以函数中的kernel不需要设置;
(2)沙尔只能求X方向或者Y方向的边缘。
函数:Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)
(1)src:输入的原始图像;
(2)Ddepth:输出图像的位深,如CV_32F,CV_64F;
(3)Dx:对X方向的求导;
(4)Dy:对Y方向的求导;
(5)Dst:输出的图像;
(6)Scale:缩放尺寸,默认值为1;
(7)Delta:
实例代码
实例代码:import os
import cv2
import numpy as npdef ScharrFilter(img_path='images/chess.png'):img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(450,450))img_dy=cv2.Scharr(src=img,ddepth=-1,dx=1,dy=0)img_dx=cv2.Scharr(src=img,ddepth=-1,dx=0,dy=1)img_dx_dy=img_dx+img_dy# img_dx_dy=cv2.add(img_dx,img_dy)cv2.imshow('img_src',img_src)cv2.imshow('img_dx',img_dx)cv2.imshow('img_dy',img_dy)cv2.imshow('img_dx_dy',img_dx_dy)cv2.waitKey(0)cv2.destroyAllWindows()def detectScharrFilter():cap=cv2.VideoCapture(0)while cap.isOpened():OK,frame=cap.read()if OK:img = cv2.resize(src=frame, dsize=(450, 450))img_dy = cv2.Scharr(src=img, ddepth=cv2.CV_64F, dx=1, dy=0)img_dx = cv2.Scharr(src=img, ddepth=cv2.CV_64F, dx=0, dy=1)img_dx_dy = img_dx + img_dycv2.imshow('object',img_dx_dy)else:print('为检测到物体')if cv2.waitKey(1)&0XFF==27:breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')ScharrFilter()# detectScharrFilter()
3.拉普拉斯算子
(1)可以同时求X,Y方向的边缘;
(2)对噪音敏感,一般需要先进行去噪再调用拉普拉斯算法(中值或者高斯算法去噪);
函数:Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None):
(1)src:输入的原始图像;
(2)Ddepth:输出图像的位深,如CV_32F,CV_64F;
(3)Dx:对X方向的求导;
(4)Dy:对Y方向的求导;
(5)Dst:输出的图像;
(6)Ksize:卷积核的大小;
(7)Scale:缩放尺寸,默认值为1;
实例代码:
import os
import cv2
import numpy as npdef LaplacianFilter(img_path='images/chess.png'):img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(450,450))img=cv2.Laplacian(src=img,ddepth=-1,ksize=5)cv2.imshow('img_src',img_src)cv2.imshow('img',img)cv2.waitKey(0)cv2.destroyAllWindows()def detectLaplacianFilter():cap=cv2.VideoCapture(0)while cap.isOpened():OK,frame=cap.read()if OK:img = cv2.resize(src=frame, dsize=(450, 450))img=cv2.Laplacian(src=img,ddepth=-1,ksize=5)cv2.imshow('object',img)else:print('为检测到物体')if cv2.waitKey(1)&0XFF==27:breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')# LaplacianFilter()detectLaplacianFilter()
关于Canny边缘检测:https://mydreamambitious.blog.csdn.net/article/details/125116318
Sobel(索贝尔),Scharr(沙尔)和Laplacian(拉普拉斯)算子——python实现相关推荐
- python检测(sobel、scharr、laplacian梯度检测)
1.sobel 通过sobel算子来检测图像的梯度 cv2.Sobel()函数用来检测梯度 x方向是右-左来得到梯度 y方向是下-上 最后 对x方向和y方向上的结果求和得出最后的梯度检测 不建议直接用 ...
- OpenCV Laplacian 拉普拉斯变换
::返回OpenCV算子速查表 OpenCV Laplacian 拉普拉斯变换 1. 函数 2. 例程 原图 Sobel和Scharr的处理结果 Laplacian 1. 函数 OpenCV官方文档链 ...
- OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
::返回OpenCV算子速查表 OpenCV Sobel和Scharr 1. 函数定义 1.1 声明 1.2 重要参数解析 2. 例程 2.1 处理效果 原图 在x,y方向分别求导 如果两个方向一起求 ...
- OpenCV 图像梯度 Sobel、Scharr、Laplacian
概念: 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(不管是横向的.纵向的.斜方向的等等),所需要的无非也是一个核模板,模板的不同结果也不同.所以可以看到,所有的这些个算子函数,归结到底 ...
- 【数字图像处理】图像锐化:拉普拉斯算子(Laplacian)、高通滤波、Sobel算子、Isotropic算子、Prewitt算子
图像锐化 图像锐化处理的目的是使模糊的图像变得更加清晰起来,通常针对引起图像模糊的原因而进行相应地锐化操作属于图像复原的内容.图像的模糊实质就是图像受到平均或积分运算造成的,因此可以对图像进行还原运算 ...
- 边缘检测:Sobel、拉普拉斯算子
边缘 边缘(edge)是指图像局部强度变化最显著的部分.主要存在于目标与目标.目标与背景.区域与区域(包括不同色彩)之间,是图像分割.纹理特征和形状特征等图像分析的重要基础. 图像强度的显著变化可分为 ...
- OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...
- 【OpenCV】边缘检测:Sobel、拉普拉斯算子
边缘 边缘(edge)是指图像局部强度变化最显著的部分.主要存在于目标与目标.目标与背景.区域与区域(包括不同色彩)之间,是图像分割.纹理特征和形状特征等图像分析的重要基础. 图像强度的显著变化可分为 ...
- OpenCV 图像梯度 :cv2.Sobel(),cv2.Schar(),cv2.Laplacian() + 数据类型设置:cv2.CV_8U,cv2.CV_16S,cv2.CV_64F
原理: 梯度本质上就是导数.OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr 和Laplacian.Sobel,Scharr 其实就是求一阶或二阶导数.Scharr ...
最新文章
- K8S集群tls证书管理
- springboot多模块项目,无法找到另一个模块的实体类
- Oracle Partition Outer Join 稠化报表
- 单链表的查找和取值-1
- 求解偏微分方程开源有限元软件deal.II学习--Step 10
- linux日常学习笔记
- .net的XML对象序列化VS WCF中xml序列化问题
- osg加载osgb数据_PCM点云数据处理软件功能使用第十七弹
- STM32F407 FSMC驱动NAND FLASH MX30LF2GE8AB 附带测试程序链接
- mongodb详细优化策略方案
- 刀片系统服务器优点,刀片服务器是什么?介绍ibm刀片服务器优点
- VBA实例6 CorelDraw 批量生成设备位号、连续编号
- USACO Raucous Rockers——dp
- 迈瑞医疗前三季归母净利81亿:同比增21.6% 营收233亿
- KinectFusion
- AS 导出aar给Unity出打包出现Unable to merge android manifests
- 评分卡实例:一步一步实现评分卡(详细长文)
- 基于Matlab对大米计数的研究
- 高通Spectra 2xx中GTM LTM的tuning重点
- MOS管与三极管比较及应用
热门文章
- ESXi的安装与使用
- 习题2.7 弹球距离 (15分) 浙江大学数据结构
- oracle查看expdp进度,监控EXPDP/IMPDP进度
- 硬盘分区格式MBR和GPT学习
- Algorithm Visualizer 类详解
- 升级linux mint内核,如何升级 Linux Mint 19.1 为 Linux Mint 19.2
- Java EE|软件视角下的操作系统
- SPI总线中CS信号的处理
- 【优化求解】改进灰狼算法求解重油热解模型matlab源码
- 震惊!Icon使用极其简单? Android-Iconics 开源库介绍