Sobel算子->方向滤波
索贝尔算子(Sobel operator)
在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量,主要用作边缘检测,可被认为是图像在垂直和水平方向变化的测量。
注意:
①观察灰度分布来描述一幅图像成为空间域,观察图像变化的频率被成为频域。
②频域分析:低频对应区域的图像强度变化缓慢,高频对应的变化快。低通滤波器去除了图像的高频部分,高通滤波器去除了图像的低频部分。
这里的卷积因子是卷积神经的一个小知识点就是以卷积因子为标本去对比总样本中的数据,如图
具体计算
将卷积因子与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:
Gx = (-1)f(x-1, y-1) + 0f(x,y-1) + 1f(x+1,y-1)
+(-2)f(x-1,y) + 0f(x,y)+2f(x+1,y)
+(-1)f(x-1,y+1) + 0f(x,y+1) + 1f(x+1,y+1)
= [f(x+1,y-1)+2f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2f(x-1,y)+f(x-1,y+1)]*
Gy =1 f(x-1, y-1) + 2f(x,y-1)+ 1f(x+1,y-1)
+0f(x-1,y) 0f(x,y) + 0*f(x+1,y)
+(-1)*f(x-1,y+1) + (-2)f(x,y+1) + (-1)f(x+1, y+1)
= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2f(x,y+1)+f(x+1,y+1)]
其中f(a,b), 表示图像(a,b)点的灰度值;
图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:
通常,为了提高效率 使用不开平方的近似值:
如果梯度G大于某一阀值 则认为该点(x,y)为边缘点。
然后可用以下公式计算梯度方向:
代码
大致了解了Sobel算子的原理,我们来看一下在OpenCV中的使用方法:
#include <iostream>
#include <iomanip>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "laplacianZC.h"int main()
{//读取图像cv::Mat image= cv::imread("boldt.jpg",0);if (!image.data)return 0; // 展示读入的图像cv::namedWindow("Original Image");cv::imshow("Original Image",image);// 计算 Sobel X 导数cv::Mat sobelX;cv::Sobel(image,sobelX,CV_8U,1,0,3,0.4,128);// 显示图像cv::namedWindow("Sobel X Image");cv::imshow("Sobel X Image",sobelX);// 计算 Sobel Y 导数cv::Mat sobelY;cv::Sobel(image,sobelY,CV_8U,0,1,3,0.4,128);// 显示图像cv::namedWindow("Sobel Y Image");cv::imshow("Sobel Y Image",sobelY);// 计算sobel的摸cv::Sobel(image,sobelX,CV_16S,1,0);cv::Sobel(image,sobelY,CV_16S,0,1);cv::Mat sobel;//compute the L1 normsobel= abs(sobelX)+abs(sobelY);double sobmin, sobmax;cv::minMaxLoc(sobel,&sobmin,&sobmax);std::cout << "sobel value range: " << sobmin << " " << sobmax << std::endl;// 打印窗口像素值for (int i=0; i<12; i++) {for (int j=0; j<12; j++)std::cout << std::setw(5) << static_cast<int>(sobel.at<short>(i+135,j+362)) << " ";std::cout << std::endl;}std::cout << std::endl;std::cout << std::endl;std::cout << std::endl;// 转换为8位图像// sobelImage = -alpha*sobel + 255cv::Mat sobelImage;sobel.convertTo(sobelImage,CV_8U,-255./sobmax,255);// 显示图像cv::namedWindow("Sobel Image");cv::imshow("Sobel Image",sobelImage);// 对Sobel norm应用阈值(低阈值)cv::Mat sobelThresholded;cv::threshold(sobelImage, sobelThresholded, 225, 255, cv::THRESH_BINARY);// 显示图像cv::namedWindow("Binary Sobel Image (low)");cv::imshow("Binary Sobel Image (low)",sobelThresholded);// 对Sobel norm应用阈值(高阈值)cv::threshold(sobelImage, sobelThresholded, 190, 255, cv::THRESH_BINARY);// 显示图像cv::namedWindow("Binary Sobel Image (high)");cv::imshow("Binary Sobel Image (high)",sobelThresholded);
参考文章:
OpenCV入门
Sobel算法
Sobel算子->方向滤波相关推荐
- 在CIELab颜色空间下使用八方向Sobel算子实现边缘检测
参考河北师范大学硕士学位论文--基于八方向Sobel算子的边缘检测算法研究. 由于自己实现滤波器运算,计算速度很慢,以后有能力再进行改进. 算子定义如下: 算法思路: 1.将RGB图像转化为CIELa ...
- 【OpenCV 4开发详解】Sobel算子
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- sobel算子原理与实践
索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子.它是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的 ...
- 差分近似图像导数算子之Sobel算子
背景引言 图像处理中,一个最基本并且最重要的卷积就是导数的计算,一般用来表达微分最常用的操作是Sobel算子,可以包含任意阶的微分以及融合偏导.主要用作为边缘检测.在技术上,它是一离散性差分算子,用来 ...
- 计算机视觉(三):基于Scipy图像处理技术,图像模糊(灰色、彩色图像高斯模糊)、图像导数(sobel算子滤波)
文章目录 一.scipy方法实现图像模糊 1.灰度图像模糊 2.彩色图像模糊 二.图像导数 1.梯度的计算 2.导数的计算 一.scipy方法实现图像模糊 小花今天和我说:"她想要一种朦胧美 ...
- OpenCV(十五)边缘检测1 -- Sobel算子(一阶微分算子,X、Y方向边缘检测)
目录 一.边缘检测基础理论 1.作用: 2.分类 1.基于搜索 2.基于零穿越 3.算子比较 二.Sobel算子基础理论 1.作用 2.原理及推导 3.更详细推导 4.Sobel函数 二.实战 1.对 ...
- python高斯滤波和降噪_python添加高斯噪声和椒盐噪声,实现中值滤波和均值滤波,实现Roberts算子和Sobel算子...
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验一,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验一. 由于时间紧张,代码没有进行任何优化, ...
- Sobel算子取代:基于特定点方向的canny边缘检测
前言: Canny边缘检测使用了Sobel算子,计算dx和dy两个方向,对于特定方向的边缘检测,可以作少量修改. 代码: 计算特定方向上的边缘 void CannyOrient( cv::Mat &a ...
- OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测
OpenCV-Python教程(6.Sobel算子) 本篇文章介绍如何用OpenCV-Python来使用Sobel算子. 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Pyth ...
最新文章
- tcl c语言笔试题,TCL技术类笔试题目.doc
- “男医生,女护士?”消除偏见,Google有大招
- 在ChemDraw中如何使用ChemACX
- 【Linux开发】彻底释放Linux线程的资源
- ABAP OO的八大理由
- 【深度学习】人脸识别模型的动手实践!
- 史上最详细的XGBoost实战
- 心情随笔20180620
- python中exec是什么意思_Python中的进程分支fork和exec详解
- pip工具使用总结以及常用库PIL、freetype的安装
- python 堆栈_利用Python列表实现堆栈(二):实现
- 常用docker命令
- 通俗的语言解释一下什么是 RPC 框架
- Java小程序的生命周期包括哪些阶段,servlet生命周期的4个阶段是什么?都有什么作用?...
- 路由与交换技术(常用版)
- 宽带连接自动断开是怎么回事?
- Linux替换压缩包下的文件,Linux下rar及zip压缩包中批量替换某文件脚本
- [UE4]获得特定类型的所有Actor:Get All Actors Of Class、Get All Actors with Interface、Get All Actors with Tag...
- ZOHO 免费小型企业邮箱和个人邮箱
- JavaScript检测视频的编码格式是否为h264
热门文章
- java发邮件(简单)
- access里的多步oledb错误_(ADO) 的 ConnectionString 属性 - SQL Server | Microsoft Docs
- SegmentFault 思否发布开源问答社区软件 Answer
- 2023最新JDK下载、安装与配置教程(jdk17.0.5以及jdk11.0.17)
- 9个国外最佳免费编程学习一站式网站,谁用谁知道!
- 计算机网络实验(计算与划分子网篇)
- OpenCV配置(利用Source编译,并配置扩展库opencv_contrib)
- 最新IP地理数据库(dat文件) --别花钱了
- 在C#中给word文档加密和解密全过程
- db2 SEQUENCE