C++-openCv中用cvNorm算灰度图像的l2范数有问题
代码如下:
int main()
{
IplImage* image=cvLoadImage("C:\boat.png",CV_LOAD_IMAGE_GRAYSCALE);
cout<<"1-norm is : "<<cvNorm(image,NULL,CV_L1)<<endl;
cout<<"2-norm is : "<<cvNorm(image,NULL,CV_L2)<<endl; //居然等于6000+,太大了,不正常啊
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当p取1,2,∞的时候分别是以下几种最简单的情形:
1-范数:║x║1=│x1│+│x2│+…+│xn│
2-范数:║x║2=(│x1│^2+│x2│^2+…+│xn│^2)^1/2
∞-范数:║x║∞=max(│x1│,│x2│,…,│xn│)
其中2-范数就是通常意义下的距离。
matlab的:norm()默认使用的是2范数。
opencv的:double cvNorm( const CvArr* arr1, const CvArr* arr2=NULL,
int norm_type=CV_L2, const CvArr* mask=NULL );当arr2不为空,且norm_type=CV_L2时,norm = ||arr1-arr2||L2 = sqrt( sumI (arr1(I)-arr2(I))2 )
我错了,答案是没有问题的,opencv中读入的图像的像素值范围为0-255,matlab中因为我用了im2double(),把像素值范围转换到了0-1,所以两者答案都没问题,粗心啊,以后的多加注意!
OpenCV中CV_L1指的是一般长度计算,CV_L2指的是欧几里得长度,matlab中norm得出的是像素矩阵的范数,这两个应该不是同一个值吧