图像渐变幅度的单位和限制是多少?例如,我知道如何获得图像的渐变幅度(见下文)。生成的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?
答案 0 :(得分:6)
你正在采取某种函数的近似导数。如果该功能是f(x)
,那么请记住,您正在f
中查看更改中的更改 {{1>} 1}}。假设函数是基于时间x
的位置,则导数的单位是位置(距离)与时间差(时间)的差异。那么图像的单位是什么?嗯,它们是某些位置的光度值。光度值的变化只是光度值,位置变化是距离。因此,导数的单位是亮度/距离。
由于我们正在处理图像,因此最小距离是一个像素,可能的最大变化是从白色到黑色(反之亦然),因此这些变化将对应于最大的渐变。但Sobel可以处理任意矩阵,其最小值和最大值可能远远超出0到1或0到255.
请注意,您可以获得斜率的负值:以像素为单位的距离始终为正,但从白色到黑色,黑色到白色的变化具有相反的符号。在Sobel计算出这些导数后,您将与角度分别计算幅度。您可以根据r(t)
和x
方向对每个方向的渐变强度进行加权来计算角度,并且需要符号返回0到360之间的任何角度。
如果你想要所有边缘的大小为正值,而非边缘的大小为0,你可以选择 L1-norm ,即y
,或者取 Euclidean 或 L2-norm the magnitude
function abs(x) + abs(y)
,就像计算三角形的斜边一样。直接添加意味着一些渐变是正面的,一些是负面的,留下灰色图像显示黑色和白色边缘。
Sobel算子只是计算像素附近的导数,而不仅仅是比较两个像素,而是六个像素,并对它们进行加权,将它们全部加起来---因此它可能比图像中的值略高一些。而且,浮点图像不会被截断为0或1,因此,您可以发送具有更大值的图像并获得更大的值。除了数据类型可以容纳的最大值之外,运算符没有虚拟最大值。 Sobel算子在梯度计算之前也会进行一些平滑以去除小边缘,但平滑算子不会缩放值。
OpenCV docs for Sobel显示运算符乘以图像的值。具体来说,对于sqrt(G(x)^2 + G(y)^2)
方向,每个3x3像素邻域按元素乘以
x
并总结。如果图片类型的最大可能值为-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
。
您将以某种方式将这些幅度中的两个加在一起,或者使用L1或L2范数。假设你坚持使用L2范数,那么在L2范数定义之后,组合幅度的最大值就是
[-4M+4m, 4M-4m]
由于L1或L2范数将正值和负值相等(它们与0的距离最重要),Sobel算子中的最小值在组合幅度上给出与最大值相同的响应。当然,你的回答的某些点可能是0,这给出了索贝尔的响应,因此也将0的大小相加,所以0将是最小值。
编辑:正如another answer中对此问题所述,我们实际上无法同时在X和Y方向达到最大值,如果你计算出最大值实际可以达到的最大值,它就会结束有点小:
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)
因此,您可以将渐变标准化为0到1 w.r.t之间。您的图像类型除以最大值。这样可以比较多个图像的边缘强度。
或者您可以使用sqrt(20) * (M - n)
功能,但最终值取决于您的图片,因此您无法比较图像中的相等值。
答案 1 :(得分:2)
最大梯度幅度
我很难同意以上答案。请注意,对于中心像素X及其3×3的相邻像素,它不能同时获得最大的水平和垂直梯度,因此对于8位系统,Sobel滤波器可以实现的最大梯度应为{{1 }},其中sqrt(20)*(M-m)
和M
与接受答案中定义的相同。邻居的结构是m
。