2017-05-20 207 views
1

什么是图像梯度幅度的单位和极限?例如,我知道如何获得图像的渐变大小(见下文)。结果Mat将包含我的源图像中每个边缘的边缘强度(大小)。什么是单位和梯度幅度的限制?

但是“边缘强度/幅度”的单位是什么?梯度方向是以度/弧度为单位,单位是多少? OpenCV中幅度的限制是什么?它是0到1,即一个边缘的强度/大小在0到1之间,其中1是完全垂直的?

所以,如果我要绘制一个统计图的大小, x轴表示边缘强度/陡度,y naxis表示具有该强度/陡度的像素数量?我对么?

Mat sX, sY, mag; 
Sobel(src, sX, CV_32F, 1, 0, 1); 
Sobel(src, sY, CV_32F, 0, 1, 1); 

magnitude(sX, sY, mag); 

// So mag now contains the image gradient magnitude 
// of the all the edges I pulled out by sobel. 
// What are the units and limits of 'edge strength'/magnitude? 
// For example are the limits 0 to 1? 

回答

5

单位

你正在做一个函数的一些近似的衍生物。如果功能是,例如,f(x),那么请记住您正在查看更改f更改x。假设函数是基于时间r(t)的位置,则导数的单位是时间(时间)差异上的位置(距离)的差异。那么图像的单位是什么?那么,它们是某些位置的光度值。光度值的变化只是光度值,位置的变化是距离。所以导数的单位是光度/距离。

梯度幅度

因为我们有一个形象的工作中,最小距离为一个像素和最大的变化可能是从白到黑(反之亦然),因此那些将与最大的梯度相对应。但Sobel可以使用任意矩阵,其最小值和最大值可能远远超出0到1或0到255.

请注意,您可以得到斜率的负值:以像素为单位的距离总是正值,但从白色变为黑色,黑色变为白色的迹象相反。在Sobel计算出这些衍生物之后,您将分别计算大小角度分开。你可以计算出基于各方向梯度的强度加权xy方向的角度,它需要的迹象。如果你想要的大小正值0和360

之间返回任何角度所有边缘,和0用于非边缘的,既可以采取L1范数,这是abs(x) + abs(y),或采取欧几里得L2范数the magnitude functionsqrt(G(x)^2 + G(y)^2),想你将计算三角形的斜边。直接添加意味着某些渐变是积极的,有些则是消极的,留下的灰色图像显示黑色和白色边缘。从Sobel算

Sobel算子简单计算像素的邻域衍生

价值,不只是比较两个,但6个像素,并且它们的权重,把它们加起来---所以可以比图像中的值高一点。而且,浮点图像在0或1时不会被截断,所以您可以发送更大值的图像并获得更大的值。在数据类型可以容纳的最大值之外,操作符没有虚拟最大值。 Sobel算子在梯度计算之前也会进行一些平滑处理,以去除小边缘,但平滑算子不会缩放这些值。

在OpenCV docs for Sobel显示操作者乘以你的形象价值。具体地,对于x方向,每3×3像素邻域得到的elementwise通过

-1 0 1 
-2 0 2 
-1 0 1 

并求和相乘。如果你的图像类型的最大可能值为M和最小值是m然后在渐变中的最大正值是

(1+2+1)*M - (1+2+1)*m = 4*M - 4*m 

,同样最大负值

-(1+2+1)*M + (1+2+1)*m = -4*M + 4*m 

这是每个方向上的渐变也一样。所以,从Sobel您在每个方向梯度的范围将是[-4M+4m, 4M-4m]

规范化操作

您将添加两个这样幅度的一起以某种方式,或者与L1-L2或范数。假如你坚持使用L2范数,最大的合力大小的将仅仅是,在L2范数的定义如下,

sqrt((4M-4m)^2 + (4M-4m)^2) = sqrt(2(16M^2-16m^2)) = 4*sqrt(2(M^2-m^2)), 

,最低将同样是

4*sqrt(2(m^2-M^2)). 

因此,你终于可以规范化梯度,具体为0到1之间您的图像类型通过添加最小值,然后除以最大值和最小值之间的差值。这将允许您比较多个图像边缘的强度。

或者你可以只使用normalize功能,但最终值将取决于您的图像,所以您不能跨图像进行比较相等的值。

+0

关于限制:你处理这个幅度的sqrt(GX^2 + GY^2)? – Micka

+0

@Micka我刚刚纠正了一分钟前的事实。根据[本教程](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html)它有时计算欧几里得范数,有时计算的绝对值之和。我不知道什么时候选择哪个。我会研究它,因为我很好奇。 –

+0

本教程仅计算近似值,函数cv :: magnitude应始终计算欧氏范数。 – Micka