Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 梯度大小的单位和限制是什么?_C++_Opencv_Computer Vision - Fatal编程技术网

C++ 梯度大小的单位和限制是什么?

C++ 梯度大小的单位和限制是什么?,c++,opencv,computer-vision,C++,Opencv,Computer Vision,图像渐变幅度的单位和限制是什么?例如,我知道如何获得图像的梯度大小(见下文)。生成的Mat将包含源图像中每个边的边强度(大小) 但“边缘强度/幅度”的单位是什么?渐变方向以度/弧度为单位,大小以什么单位表示?OpenCV中的大小限制是什么?是否为0到1,即边的强度/大小介于0和1之间,其中1完全垂直 因此,如果我在历史程序中绘制出震级;x轴表示边缘强度/陡度,y轴表示具有该强度/陡度的像素数?我说得对吗 Mat sX, sY, mag; Sobel(src, sX, CV_32F, 1, 0,

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

但“边缘强度/幅度”的单位是什么?渐变方向以度/弧度为单位,大小以什么单位表示?OpenCV中的大小限制是什么?是否为0到1,即边的强度/大小介于0和1之间,其中1完全垂直

因此,如果我在历史程序中绘制出震级;x轴表示边缘强度/陡度,y轴表示具有该强度/陡度的像素数?我说得对吗

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范数,即
sqrt(G(x)^2+G(y)^2)
,就像计算三角形的斜边一样。直接添加意味着一些渐变是正的,一些是负的,留下一个显示黑白边缘的灰色图像

来自Sobel运算符的值 Sobel操作符只是计算像素邻域的导数,不只是比较两个像素,而是六个像素,然后对它们进行加权,将它们全部相加,这样它就可以比图像中的值高一点。此外,浮点图像不会在0或1处被截断,因此,您可以发送具有更大值的图像,并从中获取更大的值。在数据类型可以保持的最大值之外,没有运算符的虚拟最大值。Sobel操作符在梯度计算之前也会进行一些平滑,以删除小边,但平滑操作符不会缩放值

OpenCV显示操作员将图像乘以的值。具体地说,对于
x
方向,每个3x3像素邻域将按元素乘以

-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范数的定义,组合震级的最大值就是

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)
由于L1或L2范数将正值和负值视为相等(它们与0的距离才是重要的),因此Sobel运算符中的最小值在组合幅值中给出的响应与最大值相同。当然,您的响应的某些点可能是0,这会给出Sobel响应,因此总和大小也为0,因此0将是最小值

编辑:正如在这个问题中所提到的,我们实际上不能同时在X和Y方向上达到最大值,如果你计算出最大值的实际值,它会变得更小:

sqrt(20) * (M - n)
因此,您可以通过除以最大值,将渐变规格化为具体介于0和1 w.r.t.之间的图像类型。这将允许您比较多个图像的边缘强度

或者您可以只使用
normalize
功能,但最终值取决于您的图像,因此您无法在图像之间比较相等的值。

单位 这是一个函数的近似导数。如果函数是,比如说,
f(x)
,那么请记住,您看到的是
f
中的变化,而不是
x
中的变化。假设函数是基于时间的位置
r(t)
,那么导数的单位是位置差(距离)与时间差(时间)。那么图像的单位是什么呢?它们是某些位置的光度值。亮度值的变化只是一个亮度值,位置的变化是一个距离。所以导数的单位是光度/距离

梯度幅度 因为我们处理的是一幅图像,最小的距离是一个像素,最大的变化可能是从白色变为黑色(反之亦然),所以这些变化对应着最大的梯度。但是哭泣