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;
}

用matlab算的:

   
  >> norm(image)
  

ans =

229.7975

显然opencv算的有问题,求解释!

opencv C++

Mithril 12 years, 2 months ago

当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,所以两者答案都没问题,粗心啊,以后的多加注意!

土御门 元春 answered 12 years, 2 months ago

Your Answer