什么是单位和梯度幅度的限制?
什么是图像梯度幅度的单位和极限?例如,我知道如何获得图像的渐变大小(见下文)。结果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?
单位
你正在做一个函数的一些近似的衍生物。如果功能是,例如,f(x)
,那么请记住您正在查看更改的f
的更改的x
。假设函数是基于时间r(t)
的位置,则导数的单位是时间(时间)差异上的位置(距离)的差异。那么图像的单位是什么?那么,它们是某些位置的光度值。光度值的变化只是光度值,位置的变化是距离。所以导数的单位是光度/距离。
梯度幅度
因为我们有一个形象的工作中,最小距离为一个像素和最大的变化可能是从白到黑(反之亦然),因此那些将与最大的梯度相对应。但Sobel可以使用任意矩阵,其最小值和最大值可能远远超出0到1或0到255.
请注意,您可以得到斜率的负值:以像素为单位的距离总是正值,但从白色变为黑色,黑色变为白色的迹象相反。在Sobel计算出这些衍生物之后,您将分别计算大小与角度分开。你可以计算出基于各方向梯度的强度加权x
和y
方向的角度,它需要的迹象。如果你想要的大小正值0和360
之间返回任何角度所有边缘,和0用于非边缘的,既可以采取L1范数,这是abs(x) + abs(y)
,或采取欧几里得或L2范数与the magnitude
function是sqrt(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
功能,但最终值将取决于您的图像,所以您不能跨图像进行比较相等的值。
关于限制:你处理这个幅度的sqrt(GX^2 + GY^2)? – Micka
@Micka我刚刚纠正了一分钟前的事实。根据[本教程](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html)它有时计算欧几里得范数,有时计算的绝对值之和。我不知道什么时候选择哪个。我会研究它,因为我很好奇。 –
本教程仅计算近似值,函数cv :: magnitude应始终计算欧氏范数。 – Micka