卷积应用-图像边缘提取

卷积应用-图像边缘提取

  • 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。
  • 如何捕捉/提取边缘 – 对图像求它的一阶导数
    delta = f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强,
  • 我已经忘记啦,不要担心,用Sobel算子就好!卷积操作!

Sobel算子

  • 是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度

  • Soble算子功能集合高斯平滑和微分求导

  • 又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像X方法与Y方向梯度图像

  • 求取导数的近似值,kernel=3时不是很准确,OpenCV使用改进版本 Scharr 函数,算子如下:

API说明cv::Sobel

cv::Sobel (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度.
Int dx. // X方向,几阶导数
int dy // Y方向,几阶导数.
int ksize, SOBEL算子kernel大小,必须是1、3、5、7、… …
double scale = 1
double delta = 0
int borderType = BORDER_DEFAULT
)

API说明cv::Scharr

cv::Scharr (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度.
Int dx. // X方向,几阶导数
int dy // Y方向,几阶导数.
double scale = 1
double delta = 0
int borderType = BORDER_DEFAULT
)

其它API

  • GaussianBlur( src, dst, Size(3,3), 0, 0, BORDER_DEFAULT );
  • cvtColor( src, gray, COLOR_RGB2GRAY );
  • addWeighted( A, 0.5,B, 0.5, 0, AB);
  • convertScaleAbs(A, B)// 计算图像A的像素绝对值,输出到图像B

处理流程

  • 高斯模糊 – 去噪声GaussianBlur()
  • 转换为灰度图像cvtColor()
  • Sobel /Scharr – 一阶导数计算Sobel ()、Scharr ()
  • 取绝对值convertScaleAbs()
  • 图像按权值合成addWeighted()
  • 显示结果

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;Mat src, src_gray;
const char* window_name1 = "Sobel Demo - Simple Edge Detector";
const char* window_name2 = "Scharr Demo - Simple Edge Detector";void Sobel_Demo();
void Scharr_Demo();int main( int, char** argv )
{// 1.加载源图像srcsrc = imread("E:/Experiment/OpenCV/Pictures/girl.jpg");if( src.empty()){ //检测图片printf("could not load image...");return -1;}namedWindow( window_name1, WINDOW_AUTOSIZE );namedWindow( window_name2, WINDOW_AUTOSIZE );namedWindow("input",CV_WINDOW_AUTOSIZE);imshow("input",src);//输出图像// 2. 先模糊,为了去噪声。将cv :: GaussianBlur应用于我们的图像以减少噪音(内核大小= 3)GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );// 3. 将滤波后的图像转换为灰度图像:cvtColor( src, src_gray, COLOR_RGB2GRAY );// 4.分别用 Sobel 算子和 Scharr 算子进行图像边缘化处理Sobel_Demo();Scharr_Demo();waitKey(0);return 0;
}
void Sobel_Demo(){// 4.1. 计算x和y方向的导数。 为此,我们使用函数cv :: SobelMat sobelX, sobelY;int scale = 1;int delta = 0;int ddepth = CV_16S; // 输出图像使用 CV_16S 相比输出深度为原图的 CV_8U ,输出的图像梯度更明显Sobel( src_gray, sobelX, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); //Sobel X 方向求导,求梯度,输出的图像是二值图Sobel( src_gray, sobelY, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT ); //Sobel Y 方向求导,求梯度// 4.2. 将部分结果转换回CV_8U:Mat abs_sobelX, abs_sobelY;convertScaleAbs( sobelX, abs_sobelX );//convertScaleAbs函数将颜色数据取绝对值,否则图像可能无法显示convertScaleAbs( sobelY, abs_sobelY );imshow("SobelX",abs_sobelX);imshow("SobelY",abs_sobelY);// 4.3. 通过添加两个方向渐变来近似渐变Mat dst;addWeighted( abs_sobelX, 0.5, abs_sobelY, 0.5, 0, dst );//振幅图像,图像合成// 4.4. 输出结果imshow( window_name1, dst );}void Scharr_Demo(){//Scharr 将梯度更加的放大,相比于 sobel ,非常的不怕干扰// 4.1. 计算x和y方向的导数。 为此,我们使用函数cv :: SobelMat scharrX, scharrY;int scale = 1;int delta = 0;int ddepth = CV_16S; // 输出图像使用 CV_16S 相比输出深度为原图的 CV_8U ,输出的图像梯度更明显Scharr( src_gray, scharrX, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );Scharr( src_gray, scharrY, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );// 4.2. 将部分结果转换回CV_8U:Mat abs_scharrX, abs_scharrY;convertScaleAbs( scharrX, abs_scharrX );//convertScaleAbs函数将颜色数据取绝对值,否则图像可能无法显示convertScaleAbs( scharrY, abs_scharrY );imshow("ScharrX",abs_scharrX);imshow("ScharrY",abs_scharrY);// 4.3. 通过添加两个方向渐变来近似渐变Mat dst;addWeighted( abs_scharrX, 0.5, abs_scharrY, 0.5, 0, dst );//振幅图像,图像合成// 4.4. 输出结果imshow( window_name2, dst );
}

运行截图

  • 原图
  • Sobel 算子
  • Scharr 算子

参考博客:

  1. https://blog.csdn.net/LYKymy/article/details/83184469
  2. https://blog.csdn.net/huanghuangjin/article/details/81138129

OpenCV-图像处理(17、Sobel算子)相关推荐

  1. OpenCV中的Sobel算子

    OpenCV中的Sobel算子 刚开始第一次接触这个东西的时候也是感觉一脸懵逼,这是什么鬼.完全看不懂.今天再次接触到,感觉理解的透彻了一点. 首先来看一下Sobel算子是个什么东西: -1 0 1 ...

  2. OpenCV 边缘检测之Sobel算子

    文章目录 Sobel算子(索贝尔算子) Sobel算子定义: Sobel算子作用: Sobel卷积因子 Sobel卷积计算公式: 相关API Sobel() convertScaleAbs() add ...

  3. 计算机视觉开源库OpenCV梯度之Sobel算子

    Sobel算子是像素图像边缘检测中最重要的算子之一,在机器学习.数字媒体.计算机视觉等信息科技领域起着举足轻重的作用.在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值.在图 ...

  4. OpenCV图像处理使用笔记(八)——Sobel算子

    前言 前面博客讲了矩阵之间的卷积操作,在图像处理中,使用一些标准的模板的卷积核与原图像进行运算,可以改变像素强度,从而影响周围其他像素的强度,常用于图像模糊.锐化及边缘检测等. Sobel算子 1.S ...

  5. OpenCV图像处理视频教程——入门篇(二)

    文章目录 10 膨胀与腐蚀 (1)形态学操作(morphology operators)--膨胀.腐蚀 (2)相关API (3)动态调整结构元素大小TrackBar 11 形态学操作 (1)开操作- ...

  6. C++实现sobel算子

    上一篇自动对焦里文章里用的评价函数,有用到opencv里的sobel算子. 我这边用C++实现下opencv里的这个算子 sobel算子的两个内核分别是{-1,0,1:-2,0,2:-1,0,1}  ...

  7. [图像处理] Python+OpenCV实现车牌区域识别及Sobel算子

    由于最近太忙,这篇文章只给出相关代码供大家学习,过一段时间会详细的写一些列Python图像处理的文章,包括各种算法原理.图像识别.图像增强.图像分类.深度学习等.本篇文章主要调用OpenCV库(cv2 ...

  8. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)

    目录 锐化(高通)空间滤波器 使用一阶导数锐化图像-梯度 锐化(高通)空间滤波器 平滑通过称为低通滤波 类似于积分运算 锐化通常称为高通滤波 微分运算 高过(负责细节的)高频,衰减或抑制低频 使用一阶 ...

  9. 【OpenCV 例程200篇】64. 图像锐化——Sobel 算子

    [OpenCV 例程200篇]64. 图像锐化--Sobel 算子 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 3 ...

  10. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

最新文章

  1. c语言坐标输出图片,tc 如何在指定坐标处 输出bmp图片??
  2. 一些我工作中经常使用的C4C ABSL代码片段
  3. k8s pod内部容器_第三章 pod:运行于kubernetes中的容器
  4. C#LeetCode刷题之#680-验证回文字符串 Ⅱ​​​​​​​(Valid Palindrome II)
  5. 8g内存够吗 rust_618已过半,这些白菜价内存你买到了吗?最便宜的8G不到120元
  6. 思科简单教程CCNA
  7. 二分排序法(折半排序)
  8. 训练集与测试集分布差距
  9. Jenkins linux 操作系统一键部署多节点
  10. 计算机视觉、模式识别、人工智能
  11. 【手写源码-设计模式9】-装饰器模式-基于王者荣耀英雄-甄姬皮肤场景
  12. HTML5--2 HTML标签
  13. Ubuntu清空回收站提示权限不够的解决办法
  14. **Mybatis怎么自动生成Mapper文件和实体类**
  15. 机智云自助开发平台,低代码快速开发新系统
  16. 啃K8s之快速入门,以及哭吧S(k8s)单节点部署
  17. 【linux】ubuntu系统硬盘操作:创建删除磁盘分区,更改磁盘分区类型,删除磁盘签名
  18. iOS/iPadOS中Office中文字体显示不正确的解决方法
  19. Nodejs 正则表达式
  20. 苹果移动设备密码破解

热门文章

  1. Xml中SelectSingleNode方法,xpath查找某节点用法
  2. python进程之间修改数据[Manager]与进程池[Pool]
  3. *(volatile unsigned long *) 语法
  4. 北大等多所高校网站被挂马 高考生浏览需小心
  5. 实用网站、软件、App分享
  6. java switch程序_Java 基础分支语句之程序流程控制switch-case
  7. 自媒体各大平台收益对比_自媒体推广平台都有哪些?
  8. ironpython怎么编译_将IronPython WPF项目编译为
  9. 3dmax 渲染关机 脚本_3DMax渲染完自动关机设置
  10. 【转】C# DateTime.Now详细用法