5

C++/OpenCV を使用して、画像のピクセル値を [0..1] の範囲に正規化しようとしています。ただし、image *= 1./255または正規化関数を使用して正規化を行うと、ピクセル値はゼロに切り捨てられます。画像を type に設定してみましたCV_32FC3

以下は私が持っているコードです:

  Mat image;
  image = imread(imageLoc, CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH);

  Mat tempImage;

  // (didn't work) tempImage *= 1./255;

  image.convertTo(tempImage, CV_32F, 3);
  normalize(image, tempImage, 0, 1, CV_MINMAX);

  int r = 100;
  int c = 150;

  uchar* ptr = (uchar*)(tempImage.data + r * tempImage.step);
  Vec3f tempVals;
  tempVals.val[0] =  ptr[3*c+1];
  tempVals.val[1] =  ptr[3*c+2];
  tempVals.val[2] =  ptr[3*c+3];
  cout<<" temp image - "<< tempVals << endl;

  uchar* ptr2 = (uchar*)(image.data + r * image.step);
  Vec3f imVals;
  imVals.val[0] =  ptr2[3*c+1];
  imVals.val[1] =  ptr2[3*c+2];
  imVals.val[2] =  ptr2[3*c+3];
  cout<<" image - "<< imVals << endl;

これにより、コンソールに次の出力が生成されます。

temp image - [0, 0, 0]
image - [90, 78, 60]
4

2 に答える 2

6

正規化を行うことができconvertTo()ます:

image.convertTo(tempImage, CV_32FC3, 1.f/255);

おそらく channel-count として に渡し3ていますが、それは正しい署名ではありません。convertTo()

于 2013-06-27T14:40:35.357 に答える
1

私はnormalize関数を使用しましたが、うまくいきました(Java):

Core.normalize(src,dst,0.0,1.0,Core.NORM_MINMAX,CvType.CV_32FC1);

宛先イメージには 32F の深度を使用する必要があります。この理由は、10 進数値を取得する必要があるため、整数以外の OpenCV データ型を使用する必要があるためだと思います。このによると、フロートの種類は32Fの深さに対応しています。チャンネル数を 1 にするとうまくいきました。CV_32FC1

また、画像の視覚的な違いを見つける可能性は低いことにも注意してください。最後に、画像にはおそらく数千のピクセルが含まれているため、コンソールにはゼロしか出力されていないように見える場合があります。ただし、データ量が多いため、CTRL+F何が起こっているのかを確認するために使用してみてください。お役に立てれば。

于 2017-03-11T17:45:03.217 に答える