cv::normalize() 中 L2_NORM 和 NORM_MINMAX 的实现有什么区别?

3
我试图复制这里讨论的密集光流: https://nanonets.com/blog/optical-flow/。这是我用来处理每个光流帧的代码片段。直觉是,H->梯度角度,S->255,V->梯度幅值的规范值。梯度来自calcOpticalFlowFarenback的输出。
       cv::calcOpticalFlowFarneback(prevgray,gray,flow,0.5,3,15,3,5,1.2,0);
       cv::split(flow,channels);
       cv::cartToPolar(channels[0],channels[1],mag,angle);




       std::vector<cv::Mat> channels_m;
       cv::Mat c1 (Mask.size(),CV_8UC1);
       cv::Mat c0 (Mask.size(),CV_8UC1);
       cv::Mat c2 (Mask.size(),CV_8UC1);
       c1 = cv::Scalar::all(255);
       c0= angle*((180/3.14)/2);
       c0.convertTo(c0, CV_8U);
       cv::normalize(mag,c2,0,255,cv::NORM_MINMAX); <----- Line of interest
       c2.convertTo(c2, CV_8U);
       channels_m.push_back(c0);
       channels_m.push_back(c1);
       channels_m.push_back(c2);

       cv::merge(channels_m,Mask);
       cv::cvtColor(Mask,cflow,cv::COLOR_HSV2BGR_FULL);

当使用归一化类型cv::NORM_L2时,我的整个HSV的V数组只返回零。但是当更改为cv::NORM_MINMAX时,它返回非零值。我认为cv::normalize的实际功能是在alpha和beta范围内归一化数组。Norm只是用于实现范围目标的归一化公式类型。那么为什么我们会看到输出差异呢?
提前感谢!

我回答了你的问题吗? - rayryeng
1
是的,谢谢! - siva_uchiha
1个回答

4
cv::NORM_L2会对数据进行归一化,使得如果将整个图像转换成一个长向量,则该向量的大小alpha。在归一化中,beta被忽略。因此,一旦通过cv::NORM_L2进行归一化,如果将此归一化输入视为一个长向量,则该向量的L2范数变为alpha。由于指定了alpha=0,因此输出图像完全为0,因为您指定了归一化后范数必须为0。 cv::NORM_MINMAX同时使用alphabeta,使得输入数组中的最小值映射到alpha,最大值映射到beta,其中所有介于两者之间的值按比例缩放。
如果你想知道我是如何知道这些的,函数的文档非常清楚:https://docs.opencv.org/4.3.0/d2/de8/group__core__array.html#ga87eef7ee3970f86906d69a92cbf064bd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接