java求sobel算子代码_sobel算子原理及opencv源码实现
sobel算子原理及opencv源码实现
简要描述
sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。
原理
算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去和原始图片作卷积,分别得到横向G(x)和纵向G(y)的梯度值,如果梯度值大于某一个阈值,则认为该点为边缘点
图1:卷积矩阵
图2:卷积运算
事实上卷积矩阵也可以由两个一维矩阵卷积而成,在opencv源码中就是用两个一维矩阵卷积生成一个卷积矩阵:
图3:由两个一维矩阵卷积生成的矩阵
static void getSobelKernels( OutputArray _kx, OutputArray _ky,
int dx, int dy, int _ksize, bool normalize, int ktype )
{
int i, j, ksizeX = _ksize, ksizeY = _ksize;
if( ksizeX == 1 && dx > 0 )
ksizeX = 3;
if( ksizeY == 1 && dy > 0 )
ksizeY = 3;
CV_Assert( ktype == CV_32F || ktype == CV_64F );
_kx.create(ksizeX, 1, ktype, -1, true);
_ky.create(ksizeY, 1, ktype, -1, true);
Mat kx = _kx.getMat();
Mat ky = _ky.getMat();
if( _ksize % 2 == 0 || _ksize > 31 )
CV_Error( CV_StsOutOfRange, "The kernel size must be odd and not larger than 31" );
std::vector kerI(std::max(ksizeX, ksizeY) + 1);
CV_Assert( dx >= 0 && dy >= 0 && dx+dy > 0 );
for( int k = 0; k < 2; k++ )
{
Mat* kernel = k == 0 ? &kx : &ky;
int order = k == 0 ? dx : dy;
int ksize = k == 0 ? ksizeX : ksizeY;
CV_Assert( ksize > order );
if( ksize == 1 )
kerI[0] = 1;
else if( ksize == 3 )
{
if( order == 0 )
kerI[0] = 1, kerI[1] = 2, kerI[2] = 1;
else if( order == 1 )
kerI[0] = -1, kerI[1] = 0, kerI[2] = 1;
else
kerI[0] = 1, kerI[1] = -2, kerI[2] = 1;
}
else
{
int oldval, newval;
kerI[0] = 1;
for( i = 0; i < ksize; i++ )
kerI[i+1] = 0;
for( i = 0; i < ksize - order - 1; i++ )
{
oldval = kerI[0];
for( j = 1; j <= ksize; j++ )
{
newval = kerI[j]+kerI[j-1];
kerI[j-1] = oldval;
oldval = newval;
}
}
for( i = 0; i < order; i++ )
{
oldval = -kerI[0];
for( j = 1; j <= ksize; j++ )
{
newval = kerI[j-1] - kerI[j];
kerI[j-1] = oldval;
oldval = newval;
}
}
}
Mat temp(kernel->rows, kernel->cols, CV_32S, &kerI[0]);
double scale = !normalize ? 1. : 1./(1 << (ksize-order-1));
temp.convertTo(*kernel, ktype, scale);
}
}
}
从opencv源码可以看出sobel的卷积矩阵在ksize==3时分别由[1,2,1]和[-1,0,1]生成。
图像的梯度值由以下公式计算而来:
一般会用近似计算公式:
对于原始图像4,p5的梯度值于:
图5 原始图像
java求sobel算子代码_sobel算子原理及opencv源码实现相关推荐
- java超市买东西代码_java超市购物系统源代码(源码大小10M)
java超市购物系统源代码(源码大小10M) 本站提供几百套大型商业源码,平均一元一套,火爆下载中...... QQ:283072.283672 EMAIL:web@hur.cn.jhwjeffrey ...
- java求sobel算子代码_sobel算子原理与实现
简介 sobel算子是图像边缘检测的最重要的算子之一,在机器学习,数字媒体.计算机视觉等领域起着重要作用.本文主要介绍sobel算子的计算过程.python实现过程和python中相关函数的介绍.方便 ...
- 银联支付java代码实现_[VIP源码]【S008】Java实现支付宝、微信、银联支付项目实例项目源码 百度云 网盘...
java源码项目名称:Java实现支付宝.微信.银联支付项目实例项目源码 支付项目源码& X3 U' W# h0 z# K 百度网盘下载链接: ( y! x% n" V9 F9 s ...
- BRIEF描述子原理、 python源码实现及基于opencv实现
写在前面: 伴着<似夜流月>,已到七月下旬.黄宁然,看你看过的算法系列,就要完结了. 参考文献镇楼: [1]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [2]徐征辉,基于BRIEF描述子 ...
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转
SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...
- slf4j + log4j原理实现及源码分析
2019独角兽企业重金招聘Python工程师标准>>> #0 系列目录# 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl ...
- Java定时任务(一) Timer及TimerTask的案例解析及源码分析
Java定时任务(一) Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...
- Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载)
Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载) 说明:主要是针对一些中大型的项目需要进行分布式以及负载均衡的架构提一些思路与建议. 面对大量用户访问.高并发请求,海量 ...
- GAT 算法原理介绍与源码分析
GAT 算法原理介绍与源码分析 文章目录 GAT 算法原理介绍与源码分析 零. 前言 (与正文无关, 请忽略) 广而告之 一. 文章信息 二. 核心观点 三. 核心观点解读 四. 源码分析 4.1 G ...
最新文章
- 独家 | 手把手教你学习R语言(附资源链接)
- python自动测试p-python网络爬虫之自动化测试工具selenium[二]
- python大小写转换if_python代码实例大小写转换,首字母大写,去除特殊字符
- day38 19-Spring整合web开发
- SAP 免费赠与客户货物的销项税处理
- 第八届蓝桥杯决赛题之平方十位数
- mysql查询,left join(求并集),where(求交集)
- Bailian2886 能被3除尽的数之和【入门】
- Java 插入排序算法
- CFD后处理出图软件Tecplot的操作技巧(未完待续)
- 怎样添加图片到黑莓7290手机里?
- 【操作指导】安捷伦数据采集器开机自检/通讯接口设置说明
- wordpress目录文件结构
- pc网页唤起QQ、企业微信、skype、whatsApp等
- Python tkinter 设置主题
- dumprep.exe遇到无效指令
- (一)TileMap使用
- window如何彻底卸载软件教程
- 写在2016的尾巴上
- 机器学习中处理缺失值的7种方法