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)
你正在采用函数的近似导数.如果函数,比如,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算子只是计算像素邻域中的导数,而不仅仅是比较两个像素,而是六个像素,并对它们进行加权,将它们全部加起来---因此它可能比图像中的值略高一些.而且,浮点图像不会被截断为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功能,但最终值将取决于您的图像,因此您无法比较图像中的相等值.