当前位置: 首页 > 编程日记 > 正文

opencv图像处理梯度边缘和角点

转自:http://blog.sina.com.cn/s/blog_4b9b714a0100c9f7.html

梯度、边缘和角点

Sobel

使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分

void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
src
输入图像.
dst
输出图像.
xorder
x 方向上的差分阶数
yorder
y 方向上的差分阶数
aperture_size
扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况, 使用 3x1 或 1x3 内核(不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:

/begin{bmatrix} -3 & 0 & 3 // -10 & 0 & 10 // -3 & 0 & 3 /end{bmatrix}

对 x-方向 以及转置矩阵对 y-方向。

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

dst(x,y) = /frac{d^{xorder+yorder}src} {dx^{xorder} dy^{yorder}} |(x,y)

由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应:

/begin{bmatrix} -1 & 0 & 1 // -2 & 0 & 2 // -1 & 0 & 1 /end{bmatrix} 核。

第二种对应:

/begin{bmatrix} -1 & -2 & -1 // 0 & 0 & 0 // 1 & 2 & 1 /end{bmatrix}

或者

/begin{bmatrix} 1 & 2 & 1 // 0 & 0 & 0 // -1 & -2 & -1 /end{bmatrix}

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即象素的深度)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 转换为 8 位的。除了 8-比特 图像,函数也接受 32-位浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。

Laplace

计算图像的 Laplacian 变换

void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );
src
输入图像.
dst
输出图像.
aperture_size
核大小 (与 cvSobel 中定义一样).

函数 cvLaplace 计算输入图像的 Laplacian变换,方法是先用 sobel 算子计算二阶 x- 和 y- 差分,再求和:

dst(x,y) = d2src/dx2 + d2src/dy2

对 aperture_size=1 则给出最快计算结果,相当于对图像采用如下内核做卷积:

/begin{bmatrix} 0 & 1 & 0 // 1 & -4 & 1 // 0 & 1 & 0 /end{bmatrix}

类似于 cvSobel 函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel一致。

Canny

采用Canny算法做边缘检测

void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );
image
输入图像.
edges
输出的边缘图像
threshold1
第一个阈值
threshold2
第二个阈值
aperture_size
Sobel 算子内核大小 (见 cvSobel).

函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的

小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

  • 注意事项:cvCanny只接受单通道图像作为输入。
  • 外部链接:经典的canny自调整阈值算法的一个opencv的实现见:http://blog.chinaunix.net/u/30231/showart_233944.htm

PreCornerDetect

计算用于角点检测的特征图,

void cvPreCornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 );
image
输入图像.
corners
保存候选角点的特征图
aperture_size
Sobel 算子的核大小(见cvSobel).

函数 cvPreCornerDetect 计算函数D_x^2D_{yy}+D_y^2D_{xx} - 2D_xD_yD_{xy} 其中 D_{/cdot} 表示一阶图像差分,D_{/cdot /cdot} 表示二阶图像差分。 角点被认为是函数的局部最大值:

// 假设图像格式为浮点数 IplImage* corners = cvCloneImage(image); IplImage* dilated_corners = cvCloneImage(image); 
IplImage* corner_mask = cvCreateImage( cvGetSize(image), 8, 1 ); cvPreCornerDetect( image, corners, 3 ); 
cvDilate( corners, dilated_corners, 0, 1 ); cvSubS( corners, dilated_corners, corners ); 
cvCmpS( corners, 0, corner_mask, CV_CMP_GE ); 
cvReleaseImage( &corners ); cvReleaseImage( &dilated_corners );

CornerEigenValsAndVecs

计算图像块的特征值和特征向量,用于角点检测
void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv, int block_size, int aperture_size=3 );
image
输入图像.
eigenvv
保存结果的数组。必须比输入图像宽 6 倍。
block_size
邻域大小 (见讨论).
aperture_size
Sobel 算子的核尺寸(见 cvSobel).
对每个象素,函数 cvCornerEigenValsAndVecs 考虑 block_size × block_size 大小的邻域 S(p),
然后在邻域上计算图像差分的相关矩阵:
M=/begin{bmatrix} /sum_{S(p)}(/frac {dI}{dx})^2 & /sum_{S(p)}(/frac{dI}{dx} /cdot /frac{dI}{dy}) // /sum_{S(p)}(/frac{dI}{dx} /cdot /frac{dI}{dy}) & /sum_{S(p)}(/frac {dI}{dy})^2 /end{bmatrix}

然后它计算矩阵的特征值和特征向量,并且按如下方式(λ1, λ2, x1, y1, x2, y2)存储这些值到输出图像中,其中
λ1, λ2 - M 的特征值,没有排序
(x1, y1) - 特征向量,对 λ1
(x2, y2) - 特征向量,对 λ2

CornerMinEigenVal

计算梯度矩阵的最小特征值,用于角点检测
void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 );
image
输入图像.
eigenval
保存最小特征值的图像. 与输入图像大小一致
block_size
邻域大小 (见讨论 cvCornerEigenValsAndVecs).
aperture_size
Sobel 算子的核尺寸(见 cvSobel). 当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数.
函数 cvCornerMinEigenVal 与 cvCornerEigenValsAndVecs 类似,但是它仅仅计算和存储每个象素点差分相关矩阵的最小特征值,
即前一个函数的 min(λ1, λ2)

CornerHarris

哈里斯(Harris)角点检测
void cvCornerHarris( const CvArr* image, CvArr* harris_responce, int block_size, int aperture_size=3, double k=0.04 );
image
输入图像。
harris_responce
存储哈里斯(Harris)检测responces的图像。与输入图像等大。
block_size
邻域大小(见关于cvCornerEigenValsAndVecs的讨论)。
aperture_size
扩展 Sobel 核的大小(见 cvSobel)。格式. 当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数。
k
Harris detector free parameter. See the formula below.
harris 检测器的自由参数。请看如下公式。
The function cvCornerHarris runs the Harris edge detector on image. Similarly to cvCornerMinEigenVal and
cvCornerEigenValsAndVecs, for each pixel it calculates 2x2 gradient covariation matrix M
over block_size×block_size neighborhood. Then, it stores
det(M) - k*trace(M)2 to the destination image. Corners in the image can be found as local maxima of the
 destination image.
函数 cvCornerHarris 对输入图像进行 Harris 边界检测。类似于 cvCornerMinEigenVal 和 cvCornerEigenValsAndVecs。
对每个像素,在 block_size*block_size 大小的邻域上,计算其2*2梯度共变矩阵(或相关异变矩阵)M。
然后,将 det(M) - k*trace(M)2 (此公式有待考证,最后的“2”是否应为平方符号?这里2应该是平方)保存到输出图像中。
输入图像中的角点在输出图像中由局部最大值表示。

FindCornerSubPix

精确角点位置

void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, 
                                         CvSize zero_zone, CvTermCriteria criteria );
image
输入图像.
corners
输入角点的初始坐标,也存储精确的输出坐标
count
角点数目
win
搜索窗口的一半尺寸。如果 win=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口
zero_zone
死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。
当值为 (-1,-1) 表示没有死区。
criteria
求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确度达到某个设定值。
criteria 可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。

函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置,或如图所示的放射鞍点(radial saddle points)。

Image:Cornersubpix.png

子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点q到其邻域点p 的向量和p点处的

图像梯度正交(服从图像和测量噪声)。考虑以下的表达式:

εi=DIpiT•(q-pi)

其中,DIpi表示在q的一个邻域点pi处的图像梯度,q的值通过最小化εi得到。通过将εi设为0,可以建立系统方程如下:

sumi(DIpi•DIpiT)•q - sumi(DIpi•DIpiT•pi) = 0

其中q的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数G和第二个梯度参数b,得到:

q=G-1•b

该算法将搜索窗的中心设为新的中心q,然后迭代,直到找到低于某个阈值点的中心位置。

 

GoodFeaturesToTrack

确定图像的强角点

void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image, 
CvPoint2D32f* corners, int* corner_count, double quality_level, double min_distance, const CvArr* mask=NULL );
image
输入图像,8-位或浮点32-比特,单通道
eig_image
临时浮点32-位图像,尺寸与输入图像一致
temp_image
另外一个临时图像,格式与尺寸与 eig_image 一致
corners
输出参数,检测到的角点
corner_count
输出参数,检测到的角点数目
quality_level
最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。
min_distance
限制因子。得到的角点的最小距离。使用 Euclidian 距离
mask
ROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像。必须为单通道的灰度图,大小与输入图像相同。
mask对应的点不为0,表示计算该点。

函数 cvGoodFeaturesToTrack 在图像中寻找具有大特征值的角点。该函数,首先用cvCornerMinEigenVal

计算输入图像的每一个象素点的最小特征值,

并将结果存储到变量 eig_image 中。然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。

下一步将最小特征值小于 quality_level•max(eig_image(x,y)) 排除掉。最后,函数确保所有发现的角点之间具有足够的距离,

(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于 min_distance )。

相关文章:

性能全面超数据库专家,腾讯提基于机器学习的性能优化系统 | SIGMOD 2019

腾讯与华中科技大学合作的最新研究成果入选了国际数据库顶级会议SIGMOD的收录论文,并将于6月30日在荷兰阿姆斯特丹召开SIGMOD 2019国际会议上公开发表。入选论文的题目为“An End-to-End Automatic Cloud Database Tuning System Using Deep Reinforcement Learning…

swift 语言评价

杂而不精,一团乱麻!模式乱套,不适合作为一门学习和研究语言。 谢谢 LZ 介绍,看完之后更不想用 Swift 了。从 C那里抄个 V-Table 来很先进嘛?别跟 C一样搞什么 STL 就好了,整这么复杂,入个门都需…

Creative Web Typography Styles | Codrops

Creative Web Typography Styles | Codrops. 非常好的文字效果

OpenCV 图像采样 插值 几何变换

转自:http://hi.baidu.com/xiaoduo170/blog/item/6eefc612c9f8e9c6c2fd786f.html InitLineIterator 初始化线段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity8 ); image 带采…

centos 6.* 修改时间

一、查看Centos的时区和时间 1、使用date命令查看Centos时区 [rootVM_centos ~]# date -R Mon, 26 Mar 2018 19:14:03 0800 2、查看clock系统配置文件 [rootVM_centos ~]# cat /etc/sysconfig/clock ZONE"Asia/Shanghai" 3、查看系统的硬件时间,即BIOS时间…

别光发Paper,搞点实际问题

文 / LVS话说几个月前,我参加了一场学术大会,台上的教授不是北大、清华就是浙大、上交大,几位教授不约而同的吐槽招通信、算法和编解码的学生太难了。为什么呢?原来,先不比金融,仅仅与同是IT领域的AI专业就…

spring mvc文件上传小例子

spring mvc文件上传小例子 1.jsp页面 <%page contentType"text/html;charsetUTF-8"%> <%page pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%> <% taglib prefix"fmt…

解密Kernel:为什么适用任何机器学习算法?

作者 | Marin Vlastelica Pogančić译者 | 陆离编辑 | 一一出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;机器学习中Kernel的秘密&#xff08;一&#xff09;本文探讨的不是关于深度学习方面的&#xff0c;但可能也会涉及一点儿&#xff0c;主要是因为…

03-Java的基础语法

一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&…

图像处理-仿射变换 AffineTransform

转自&#xff1a;http://fairywangyutang.blog.sohu.com/146834554.html AffineTransform类描述了一种二维仿射变换的功能&#xff0c;它是一种二维坐标到二维坐标之间的线性变换&#xff0c;保持二维图形的“平直性”&#xff08;译注&#xff1a;straightness&#xff0c;即变…

以前初学php用的分页函数

page.php <?php /* *http://www.iiwnet.com/php/ PHP学习 * */ function _PAGEFT($totle, $displaypg 20, $url ) { global $page, $firstcount, $pagenav, $_SERVER; $GLOBALS["displaypg"] $displaypg; if (!$page) $page 1; if (!$url) { $url $_SERVER[…

深度有趣 | 27 服饰关键点定位

简介 介绍如何使用CPM&#xff08;Convolutional Pose Machines&#xff09;实现服饰关键点定位 原理 关键点定位是一类常见而有用的任务&#xff0c;某种意义上可以理解为一种特征工程 人脸关键点定位&#xff0c;可用于人脸识别、表情识别人体骨骼关键点定位&#xff0c;可用…

有答案了!一张图告诉你到底学Python还是Java!你咋看?

2019年&#xff0c;该学Java还是Python&#xff1f;不&#xff0c;实际上应该这样问&#xff1a;都9102年了&#xff0c;难道有谁不想成为Python程序员吗&#xff1f;作为“常青树大佬”Java 和“新晋大佬”Python &#xff0c;经常被人拿来对比&#xff0c;对于刚开始起步学习…

图像二值化----otsu(最大类间方差法、大津算法)(二)

转自&#xff1a;http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法&#xff0c;有时也称之为大津算法&#xff0c;被认为是图像分割中阈值选取的最佳算法&#xff0c;计算简单&#xff0c;不受图像亮度和对比度的影响&#xff0c;因此在数字图…

android同时使用多个library时的问题

剧情是这样&#xff0c;我的app要使用两个library&#xff0c;如&#xff1a;LibraryA&#xff0c;LibraryB。这两个库又都需要support.v4.jar。 由于加载的时间不同&#xff0c;所以两个support.v4.jar不同&#xff0c;出错的提示如下&#xff1a; [2012-09-28 16:37:22 - ] F…

C#版 - Leetcode49 - 字母异位词分组 - 题解

C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交:https://leetcode.com/problems/group-anagrams/ 题目描述 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: [&quo…

来学习几个简单的Hive函数吧!

作者 | 石晓文转载自小小挖掘机&#xff08;ID:wAIsjwj&#xff09;咳咳&#xff0c;今天来介绍一下几个Hive函数吧&#xff0c;先放一张我登哥划水的照片&#xff0c;希望大家也做一只自由的鱼儿&#xff0c;在知识的海洋里游呀游&#xff0c;嘻嘻&#xff01;今天我们来介绍几…

OpenCV编程案例:使用轮廓函数检测连通区域

转自&#xff1a;http://www.aiseminar.cn/bbs/thread-617-1-1.html 此案例位于CXCORE中cvDrawContours函数介绍部分给出。此程序首先载入一个二值图像文件&#xff0c;然后使用函数再次二值化确认。接着使用cvFindContours找到轮廓&#xff0c;然后使用填充方式绘制轮廓线内部…

[译]Web Inspector开始支持CSS区域

最近,开发人员和设计师们可以在WebKit中尝试使用CSS区域特性了,我们认为是时候给他们一些开发工具了.最新版本的Chrome Canary中的web inspector现在已经支持下面这些功能: 查找文档中所有的命名流.显示每个命名流的内容和区域链.高亮页面中的CSS区域,就像是把鼠标放在web insp…

这或许是东半球分析十大排序算法最好的一篇文章

作者 | 不该相遇在秋天转载自五分钟学算法&#xff08;ID:CXYxiaowu&#xff09;前言本文全长 14237 字&#xff0c;配有 70 张图片和动画&#xff0c;和你一起一步步看懂排序算法的运行过程。预计阅读时间 47 分钟&#xff0c;强烈建议先收藏然后通过电脑端进行阅读。No.1 冒泡…

opencv使用cvFindContours提取联通域

转自&#xff1a;http://hi.baidu.com/irmosgarden/blog/item/8ce0174c54b307fad72afcbc.html // m_imgFeature为黑白目标图像&#xff0c;白色为前景&#xff0c;黑色为背景 // 注意此函数会修改m_imgFeature内容。若其不可更改&#xff0c;应另建立副本 // 1. count contou…

朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

朱晔的互联网架构实践心得S1E9&#xff1a;架构评审一百问和设计文档五要素 【下载文本PDF进行阅读】 本文我会来说说我认为架构评审中应该看的一些点&#xff0c;以及我写设计文档的一些心得。助你在架构评审中过五关斩六将&#xff0c;助你写出能让人收藏点赞的设计文档。 技…

Mail Archiving Expert电子邮件归档专家

概况作为企业往来最通用的交流工具&#xff0c;企业中有95%以上的文件都是通过邮件来传递与沟通&#xff0c;但是一旦当邮件服务罢工&#xff0c;影响的不仅仅是企业信息交流无法正确与及时的传达&#xff0c;更可能影响企业与客户之间的交易&#xff0c;其后果更是不堪设想&am…

C++中MessageBox的常见用法

转自&#xff1a;http://blog.csdn.net/qiumingbo/archive/2007/05/25/1625324.aspxMessageBox用法消息框是个很常用的控件&#xff0c;属性比较多&#xff0c;本文列出了它的一些常用方法&#xff0c;及指出了它的一些应用场合。1.MessageBox("这是一个最简单的消息框&am…

对标Mobileye!百度Apollo公布L4级自动驾驶纯视觉解决方案Apollo Lite

美国当地时间6月16日-20日&#xff0c;全球计算机视觉及模式识别领域顶级学术会议CVPR 2019&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;于美国长滩召开。百度Apollo在CVPR 2019公开了自动驾驶纯视觉城市道路闭环解决方案--百度Apollo Lite…

后台服务项目的白盒测试之旅

本文来自阿网易云社区作者&#xff1a;孙婷婷白盒测试起因17年下半年我开始介入部门新项目的服务v2版本的功能测试。刚接手项目时&#xff0c;感到十分头疼&#xff0c;首先它不像我刚接触测试时做的to C端项目&#xff0c;主要是页面展示操作&#xff0c;黑盒测试足够&#xf…

【自然框架 NatureFW】里的两种“映射”方式

自然框架里面采用了两种映射关系&#xff0c;一个是流行的ORM&#xff0c;另一是非主流的“CCM ” &#xff08;我自己想的&#xff0c;呵呵&#xff09;。 先说一下ORM。ORM是O和R的映射关系。也看到很多人写关于ORM的文章&#xff0c;发现好像有个误区。这个误区就是&#x…

ordfilt2函数功能说明

转自&#xff1a;http://www.ilovematlab.cn/thread-91331-1-1.html ordfilt2函数在MATLAB图像处理工具箱中提供了二维统计顺序滤波函数ordfilt2函数。二维统计顺序滤波是中值滤波的推广&#xff0c;对于给定的n个数值&#xff5b;al ,a2,...,an&#xff5d;&#xff0c;将它们…

今晚直播写代码|英伟达工程师亲授如何加速YOLO目标检测

NVIDIA TensorRT是一种高性能深度学习推理优化器和运行时加速库&#xff0c;可以为深度学习推理应用程序提供低延时和高吞吐量。通过TensorRT&#xff0c;开发者可以优化神经网络模型&#xff0c;以高精度校对低精度&#xff0c;最后将模型部署到超大规模数据中心、嵌入式平台或…

TensorFlow Lite:TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案 | Google 开发者大会 2018...

Google 开发者大会 (Google Developer Days&#xff0c;简称 GDD) 是展示 Google 最新开发者产品和平台的全球盛会&#xff0c;旨在帮助你快速开发优质应用&#xff0c;发展和留住活跃用户群&#xff0c;充分利用各种工具获得更多收益。2018 Google 开发者大会于 9 月 20 日和 …