C++ 索贝尔的意义';s在搜索Harris角点时缩放
对于中的函数C++ 索贝尔的意义';s在搜索Harris角点时缩放,c++,opencv,feature-extraction,feature-detection,sobel,C++,Opencv,Feature Extraction,Feature Detection,Sobel,对于中的函数vec,我一直在理解局部变量scale传递到Sobel(从第257行到第263行)的效果: int-depth=src.depth(); 双刻度=(双刻度)(10?孔径大小:3)-1))*块大小; 如果(孔径大小
vec
,我一直在理解局部变量scale
传递到Sobel
(从第257行到第263行)的效果:
int-depth=src.depth();
双刻度=(双刻度)(10?孔径大小:3)-1))*块大小;
如果(孔径大小<0)
比例*=2.0;
如果(深度==CV_8U)
比例*=255.0;
刻度=1.0/刻度;
据我所知,如果
src
为CV\u 8UC1
,则刻度将为1/(255*12)
。应用1/255会将像素的强度标准化为[0,1]
,但是附加比例1/12
如何?它的作用是什么?3x3 Sobel滤波器是通过矩阵乘以导数滤波器[-1 0 1]和平滑滤波器[1 2 1]得到的。当孔径变为5x5时,另一个平滑应用于两个其他滤波器。这些过滤器的“正确”标准化,即使它们相加为1的标准化,对于导数应为1/2,对于平滑应为1/4。因此,3x3过滤器应标准化为1/8,5x5过滤器应标准化为1/128,7x7过滤器应标准化为1/2048。调用r孔径,缩放比例应为:
.
可以找到更多细节
此“应”的代码为:
双刻度=1
int depth = src.depth();
double scale = (double)(1 << ((aperture_size > 0 ? aperture_size : 3) - 1)) * block_size;
if( aperture_size < 0 )
scale *= 2.0;
if( depth == CV_8U )
scale *= 255.0;
scale = 1.0/scale;
double scale = 1 << (2 * aperture_size - 3);
double scale = 1 << (aperture_size - 1);