【opencv学习笔记】018之Sobel算子与Scharr算子
目录
一、前言
二、算子
1、咋理解算子
2、算子定义
三、Sobel算子
1、讲解
2、API
3、代码展示
4、执行结果
四、Scharr算子
1、讲解
2、API
3、代码展示
4、执行结果
一、前言
继续填坑。
如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:
【OpenCV系列】:https://blog.csdn.net/shuiyixin/article/category/7581855
如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
二、算子
1、咋理解算子
今天开始,我们来了解一下算子的概念,这个名字可能大家刚开始入门计算机视觉,会听到,但是会感觉别扭,就觉得,这是个啥?
听着不太对劲,是不是说错了?
其实呢,算子本身来源于数学。
啊!数学
啊!数学
啊!数学
如果你想掌控全世界,那你一定要会数学。
好,崇拜完数学之后,我们来了解一下算子。
简单来说,算子就是一个东西通过算子之后之后,变成了另一个东西。
这个熟悉不,大家想想函数,一个自变量的值,通过映射,得到了函数值。一个图像,经过卷积操作,变成另一个图像,一块肉,经过加工,变成了香肠。
这样大家是不是就更容易理解啦。
2、算子定义
趁热打铁,我们来看一下算子的概念:
狭义的算子实际上是指从一个函数空间到另一个函数空间(或它自身)的映射。
广义的算子的定义只要把上面的空间推广到一般空间,可以是向量空间,赋范向量空间,内积空间,或更进一步,Banach空间,Hilbert空间都可以。算子还可分为有界的与无界的,线性的与非线性的等等类别。
三、Sobel算子
1、讲解
讲完了算子,我们来说一个具体的算子Sobel算子,可以让大家理解地更深。
Sobel算子又叫索贝尔算子,是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。Sobel算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
Sobel算子所采用的算法是先进行加权平均,然后进行微分运算,算子的计算方法如下:
对于一个二元函数f(x,y)来说,x有三个取值,y有三个取值,那我们就可以构造一个3×3的矩阵,矩阵的中心点为(x,y),向上向左为减一,向右向下为加一。我们用矩阵来表示一下上面的式子:
由此,我们设计两个核,一个是x方向上的,一个是y方向上的,设计的两个核是3×3的矩阵,分别是:
所以,如果对于一个图像I,我们能通过这两个核分别计算该图像X方向和Y方向的梯度:
我们也能根据两个方向的梯度计算总的梯度:
2、API
void Sobel( InputArray src, OutputArray dst, int ddepth, int dx,int dy,int ksize = 3,double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT
);
函数参数含义如下:
(1)InputArray类型的src ,输入图像。
(2)OutputArray类型的dst ,输出图像,图像的大小、通道数和输入图像相同。
(3)int类型的ddepth,输出图像深度,请参阅@ref filter_depth“组合”;如果是8位输入图像,则会导致导数截断。
(4)int类型的dx,导数x的阶数。
(5)int类型的dy,导数y的阶数。
(6)int类型的ksize,扩展Sobel内核的大小;它必须是1、3、5或7。
(7)double类型的scale,计算派生值的可选比例因子;默认情况下,不应用缩放(有关详细信息,请参见cv::getDerivKernels。
(8)double类型的delta,在将筛选的像素存储到dst中之前添加到这些像素的可选值。说的有点专业了其实就是给所选的像素值添加一个值delta。
(9)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
3、代码展示
在这里,我们用到一个很简单的函数:
void convertScaleAbs( InputArray src, OutputArray dst, double alpha= 1, double belt= 0,
);
我们这个函数只需要设置前两个参数,这个函数可以计算图像src的像素绝对值,输出到图像dst。
#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat img, gx, gy, src;img = imread("E:/image/girl2.png");if (!img.data){cout << "could not load image !";return -1;}imshow("【输入图像】", img);Sobel(img, gx, CV_16S, 1, 0);Sobel(img, gy, CV_16S, 0, 1);convertScaleAbs(gx, gx);convertScaleAbs(gy, gy);addWeighted(gx, 0.5, gy, 0.5, 0, src);imshow("【输出图像】", src);waitKey(0);return 0;
}
4、执行结果
四、Scharr算子
1、讲解
当然,对导数比较熟悉的同学呢,我们都知道,导数是对于连续函数来说的,现在的这个不是连续的函数呀,所以这种方式,其实只是一个近似解。但是这种近似解,对于上面的来说又不是特别的精确,所以,在opencv中,采用更加精确的Scharr算子:
2、API
void Scharr( InputArray src, OutputArray dst, int ddepth, int dx,int dy,double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT
);
函数参数含义如下:
(1)InputArray类型的src ,输入图像。
(2)OutputArray类型的dst ,输出图像,图像的大小、通道数和输入图像相同。
(3)int类型的ddepth,输出图像深度,请参阅@ref filter_depth“组合”;如果是8位输入图像,则会导致导数截断。
(4)int类型的dx,导数x的阶数。
(5)int类型的dy,导数y的阶数。
(6)double类型的scale,计算派生值的可选比例因子;默认情况下,不应用缩放(有关详细信息,请参见cv::getDerivKernels。
(7)double类型的delta,在将筛选的像素存储到dst中之前添加到这些像素的可选值。说的有点专业了其实就是给所选的像素值添加一个值delta。
(8)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
3、代码展示
#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat img, gx, gy, src;img = imread("E:/image/girl2.png");if (!img.data){cout << "could not load image !";return -1;}imshow("【输入图像】", img);Scharr(img, gx, CV_16S, 1, 0);Scharr(img, gy, CV_16S, 0, 1);convertScaleAbs(gx, gx);convertScaleAbs(gy, gy);addWeighted(gx, 0.5, gy, 0.5, 0, src);imshow("【输出图像】", src);waitKey(0);return 0;
}
4、执行结果
大家也可以自己尝试一下呀,一定要多做练习!
【opencv学习笔记】018之Sobel算子与Scharr算子相关推荐
- opencv学习笔记16:梯度运算之scharr算子及其函数使用
前文介绍了sobel算子 opencv学习笔记14:sobel算子及其函数使用 scharr算子理论 系数和sobel不一样,其他一样. scharr函数使用 dst=cv2.Scharr(src,d ...
- opencv学习笔记17:梯度运算之laplacian算子及其应用
laplacian算子理论 前文介绍了sobel算子及其函数使用 和scharr算子及其函数使用 使用方法 不同算子比较 sobel,和scharr算子:右边121列-左边121列.右边-3,10,3 ...
- Opencv学习笔记(二十三) 改进边缘检测算子-----Marr-Hildresh
Marr-Hildresh边缘检测算子,用于解决边缘检测的核心问题---定位精度和抑制噪声.Marr-Hildreth算子以高斯函数为平滑算子,结合拉普拉斯算子提取二阶导数的零交叉理论进行边缘检测.边 ...
- 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)
经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...
- opencv学习笔记18:canny算子边缘检测原理及其函数使用
canny边缘检测原理 去噪:边缘检测容易受到噪声的影响,在此之间,先去噪,通常采用高斯滤波器.opencv学习笔记11:图像滤波(均值,方框,高斯,中值) 梯度:对去噪后的图像采用sobel算子计算 ...
- OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...
- OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle()
OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle() 1. ...
- OpenCV学习笔记(三):多通道图像分离、混合算子:split(),merge()
OpenCV学习笔记(三):多通道图像分离.混合算子:split(),merge() #include <opencv2/opencv.hpp>#define BRG_BLUE_CHANN ...
- OpenCV学习笔记(六)(七)(八)(九)(十)
OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...
- OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )
OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...
最新文章
- OpenCV+python:ROI与泛洪填充
- YbtOJ#832-鸽子饲养【凸包,Floyd】
- git 拉取 未能顺利结束 (退出码 1)_小白的 asyncio :原理、源码 到实现(1)
- Python+tkinter实现超时无键盘操作自动退出
- 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
- 计算机一级wps视频教程,计算机一级WPS
- java中求1 2 =3,1. java dom编程艺术---杨涛、王建桥 -第3章 DOM(自总)
- 官宣!袋鼠云融资轮次和核心产品!欢迎来投
- IT项目经理如何学习
- 小米的隔空充电技术或许是概念产品,需要跨越的技术难点太多
- sessionregistry一直为空得_天地为书房
- tex常用函数 上下行对齐_tex常用函数 上下行对齐_【学术写作】如何优雅地(用TeX)写AI论文...
- 死链提交为什么不能提交 html文件,手把手教你向百度站长平台提交XML和TXT死链文件...
- Tita OKR:掌握大局的仪表盘
- 使用 Python 创建自己的文档扫描仪
- 公式编辑神器-MathType
- 使用alpine镜像封装nginx 及php镜像
- python rgb2gray_Python--图像处理(2)
- uva计算机水平,UVa的Computer Science「弗吉尼亚大学计算机科学系」
- java中poi导入excel_java中使用poi实现导入Excel
热门文章
- 中概股再遭重创:猎豹移动破发 金融界暴跌23.17%
- 高内聚低耦合的通俗解释
- ajax文件插件上传,7 款基于 JavaScript/AJAX 的文件上传插件
- 2021年中国再生塑料行业现状分析:回收利用量及回金额双增长 [图]
- idea 服务器tomcat配置文件,IntelliJ IDEA Tomcat配置详解(图文)
- python运行pyc和pyo文件_python生成pyc文件和pyo文件
- 药企的主数据以及质量管理这块应该怎么管理?
- 2016年3月android面试总结(1)
- js获取当前年月日时间
- schtasks命令创建计划任务