梯度大小的单位和极限是什么?
What are the units and limits of gradient magnitude?
图像梯度大小的单位和限制是什么?例如,我知道如何获取图像的梯度幅度(见下文)。结果 Mat
将包含源图像中每个边缘的边缘强度(幅度)。
但是'Edge Strength/Magnitude'的单位是什么?梯度方向以 degrees/radians 为单位,幅度的单位是什么? OpenCV 中 Magnitude 的限制是什么?它是 0 到 1,即边的 strength/magnitude 介于 0 和 1 之间,其中 1 是完全垂直的?
所以如果我要在直方图中绘制幅度; x 轴表示边缘 strength/steepness,y 轴表示具有 strength/steepness 的像素数?我说得对吗?
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
中的 change 而不是 change ] 在 x
。假设函数是基于时间的位置r(t)
,那么导数的单位是位置差(距离)除以时间差(时间)。那么图像的单位是什么?嗯,它们是某些位置的光度值。光度值的变化只是一个光度值,位置的变化就是一个距离。所以导数的单位是luminosity/distance。
梯度大小
由于我们处理的是图像,最小距离是一个像素,最大可能的变化是从白色到黑色(反之亦然),因此它们对应于最大的渐变。但是 Sobel 可以处理最小值和最大值可以在 0 到 1 或 0 到 255 之外的任意矩阵。
请注意,您可能会得到斜率的负值:以像素为单位的距离始终为正,但从白色到黑色和从黑色到白色的变化符号相反。在 Sobel 计算出这些导数后,您将分别计算 幅度 和 角度 。您可以根据每个方向的梯度强度对 x
和 y
方向进行加权来计算角度,并且它需要符号 return 0 到 360 之间的任何角度。
如果你想要所有边缘的大小为正值,非边缘为0,你可以采用L1-norm,即abs(x) + abs(y)
,或者采用 Euclidean 或 L2-norm 和 the magnitude
function,即 sqrt(G(x)^2 + G(y)^2)
,就像您计算三角形的斜边。直接添加意味着一些渐变是正的,一些是负的,留下一个显示黑白边缘的灰色图像。
来自 Sobel 运算符的值
Sobel 运算符简单地计算像素邻域的导数,不仅仅是比较两个像素,而是比较六个像素,并对它们进行加权,将它们全部相加——因此它可以比图像中的值高一点.而且,浮点图像不会在 0 或 1 处被截断,因此您可以发送具有更大值的图像并获得更大的值。除了数据类型可以容纳的最大值之外,运算符没有虚拟最大值。 Sobel算子在梯度计算之前也会做一些平滑处理,去除小的边缘,但是平滑算子不会缩放值。
OpenCV docs for Sobel 显示操作员将图像乘以的值。具体来说,对于 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
函数,但最终值将取决于您的图像,因此您无法比较图像之间的相等值。
最大梯度幅度
我很难同意上面的回答。请注意,对于中心像素 X 及其 3✕3 个相邻像素,它不能同时取最大水平和垂直梯度,因此对于 8 位系统,Sobel 滤波器可以实现的最大梯度应为 sqrt(20)*(M-m)
,其中 M
和 m
与接受的答案中定义的相同。社区的结构是 [m M M; m X M; m m M]
.
图像梯度大小的单位和限制是什么?例如,我知道如何获取图像的梯度幅度(见下文)。结果 Mat
将包含源图像中每个边缘的边缘强度(幅度)。
但是'Edge Strength/Magnitude'的单位是什么?梯度方向以 degrees/radians 为单位,幅度的单位是什么? OpenCV 中 Magnitude 的限制是什么?它是 0 到 1,即边的 strength/magnitude 介于 0 和 1 之间,其中 1 是完全垂直的?
所以如果我要在直方图中绘制幅度; x 轴表示边缘 strength/steepness,y 轴表示具有 strength/steepness 的像素数?我说得对吗?
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
中的 change 而不是 change ] 在 x
。假设函数是基于时间的位置r(t)
,那么导数的单位是位置差(距离)除以时间差(时间)。那么图像的单位是什么?嗯,它们是某些位置的光度值。光度值的变化只是一个光度值,位置的变化就是一个距离。所以导数的单位是luminosity/distance。
梯度大小
由于我们处理的是图像,最小距离是一个像素,最大可能的变化是从白色到黑色(反之亦然),因此它们对应于最大的渐变。但是 Sobel 可以处理最小值和最大值可以在 0 到 1 或 0 到 255 之外的任意矩阵。
请注意,您可能会得到斜率的负值:以像素为单位的距离始终为正,但从白色到黑色和从黑色到白色的变化符号相反。在 Sobel 计算出这些导数后,您将分别计算 幅度 和 角度 。您可以根据每个方向的梯度强度对 x
和 y
方向进行加权来计算角度,并且它需要符号 return 0 到 360 之间的任何角度。
如果你想要所有边缘的大小为正值,非边缘为0,你可以采用L1-norm,即abs(x) + abs(y)
,或者采用 Euclidean 或 L2-norm 和 the magnitude
function,即 sqrt(G(x)^2 + G(y)^2)
,就像您计算三角形的斜边。直接添加意味着一些渐变是正的,一些是负的,留下一个显示黑白边缘的灰色图像。
来自 Sobel 运算符的值
Sobel 运算符简单地计算像素邻域的导数,不仅仅是比较两个像素,而是比较六个像素,并对它们进行加权,将它们全部相加——因此它可以比图像中的值高一点.而且,浮点图像不会在 0 或 1 处被截断,因此您可以发送具有更大值的图像并获得更大的值。除了数据类型可以容纳的最大值之外,运算符没有虚拟最大值。 Sobel算子在梯度计算之前也会做一些平滑处理,去除小的边缘,但是平滑算子不会缩放值。
OpenCV docs for Sobel 显示操作员将图像乘以的值。具体来说,对于 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 将是最小值。
编辑:正如
sqrt(20) * (M - n)
因此您可以将梯度归一化到具体在 0 和 1 之间 w.r.t。您的图像类型除以最大值。这将允许您比较多个图像的边缘强度。
或者您可以只使用 normalize
函数,但最终值将取决于您的图像,因此您无法比较图像之间的相等值。
最大梯度幅度
我很难同意上面的回答。请注意,对于中心像素 X 及其 3✕3 个相邻像素,它不能同时取最大水平和垂直梯度,因此对于 8 位系统,Sobel 滤波器可以实现的最大梯度应为 sqrt(20)*(M-m)
,其中 M
和 m
与接受的答案中定义的相同。社区的结构是 [m M M; m X M; m m M]
.