梯度幅度的单位和限制是多少?

saz*_*azr 1 c++ opencv computer-vision

图像梯度幅度的单位和限制是多少?例如,我知道如何获得图像的渐变幅度(见下文).结果Mat将包含源图像中每条边的边缘强度(幅度).

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

所以,如果我要在一个histrogram绘制幅度; x轴表示边缘强度/陡度,y n轴表示具有该强度/陡度的像素数?我对么?

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?
Run Code Online (Sandbox Code Playgroud)

alk*_*asm 6

单位

你正在采用函数的近似导数.如果函数,比如,f(x),然后记住你正在寻找的变化f变化x.假设函数是基于时间的位置r(t),则导数的单位是位置(距离)相对于时间(时间)的差异.那么图像的单位是什么?嗯,它们是某些位置的光度值.光度值的变化只是光度值,位置变化是距离.因此,导数的单位是亮度/距离.

梯度幅度

由于我们正在处理图像,因此最小距离是一个像素,可能的最大变化是从白色到黑色(反之亦然),因此这些将与最大的渐变相对应.但Sobel可以处理任意矩阵,其最小值和最大值可能远远超出0到1或0到255.

请注意,您可以获得斜率的负值:以像素为单位的距离始终为正,但从白色到黑色和黑色到白色的变化具有相反的符号.在Sobel计算出这些导数之后,您将从角度分别计算幅度.您可以根据每个方向上渐变强度对方向和方向进行加权来计算角度,并且需要符号返回0到360之间的任何角度.xy

如果你想为所有边缘的大小非边缘的正值,0,你可以把L1范数,这是abs(x) + abs(y),或采取欧几里得L2范magnitude功能sqrt(G(x)^2 + G(y)^2)一样,你会到计算三角形的斜边.直接添加意味着一些渐变是正的,有些是负的,留下灰色图像显示黑色和白色边缘.

来自Sobel运营商的价值观

Sobel算子只是计算像素邻域中的导数,而不仅仅是比较两个像素,而是六个像素,并对它们进行加权,将它们全部加起来---因此它可能比图像中的值略高一些.而且,浮点图像不会被截断为0或1,因此,您可以发送具有更大值的图像并获得更大的值.除了数据类型可以容纳的最大值之外,运算符没有虚拟最大值.Sobel算子在梯度计算之前也会进行一些平滑以去除小边缘,但平滑算子不会缩放值.

Sobel的OpenCV 文档显示了运算符乘以图像的值.具体地,对于该x方向,每个3×3像素邻域逐元素地乘以

-1 0 1
-2 0 2
-1 0 1
Run Code Online (Sandbox Code Playgroud)

并总结.如果图像类型的最大可能值为,M则最小值为m渐变中的最大正值

(1+2+1)*M - (1+2+1)*m = 4*M - 4*m
Run Code Online (Sandbox Code Playgroud)

同样最大的负值是

-(1+2+1)*M + (1+2+1)*m = -4*M + 4*m
Run Code Online (Sandbox Code Playgroud)

每个方向的渐变都是一样的.因此,每个方向的渐变范围都Sobel将是[-4M+4m, 4M-4m].

规范化运营商

您将以某种方式将这些幅度中的两个加在一起,或者使用L1或L2范数.假设你坚持使用L2范数,那么在L2范数定义之后,组合幅度的最大值就是

MAX = sqrt((4*M - 4*m)**2 + (4*M - 4*m)**2) 
    = sqrt(2 * (4*M - 4*m)**2)
    = sqrt(2 * 16 * (M - m)**2) 
    = sqrt(32) * (M - m)
Run Code Online (Sandbox Code Playgroud)

而最低限度也是如此

sqrt(20) * (M - n)
Run Code Online (Sandbox Code Playgroud)

因此,您最终可以通过添加最小值并除以最大值和最小值之间的差值,将梯度标准化为特定介于0和1之间的图像类型.这将允许您比较多个图像的边缘强度.

或者您可以使用该normalize功能,但最终值将取决于您的图像,因此您无法比较图像中的相等值.