2

cv2 ライブラリである Python 用の openCV を使用しています。次の関数を使用して、画像 im_converted のヒストグラムを計算します

hist = cv2.calcHist([im_converted], channels, None, histSize, ranges,hist, 1)

ここで、im_converted は uint8 型の numpy 配列としてロードされます。

hist は float32 型の numpy 配列に強制されているようです。逆投影機能を使用すると問題が発生します。(注: ヒストグラム st np.sum(hist)=1 を正規化します)

backProj = cv2.calcBackProject([im_converted], channels, hist, ranges,scale);

ドキュメントはこちらです。backProj は強制的に uint8 numpy 配列になります。

  • スケール=1 の場合、backProj = 0
  • scale=255 の場合、backProj はゼロではありませんが、値は非常に小さいです。

私の質問は次のとおりです。タイプ間の違いを考慮して、適用する必要があるスケール係数は何ですか? タイプを変更する方法はありませんか?(注: hist=zeros(histSize, dtype=uint8) を実行しようとしましたが、これは失敗しました。最終的に float32 ヒストグラムが得られました。)

4

1 に答える 1

3

これは、画像のサイズによって異なります。イメージが 255 ピクセルを超える場合、ビンがオーバーフローする可能性があるため、ヒストグラムの uint8 データ型では不十分です。

行 OpenCV は、返された画像のデータ型を、calcBackProject渡された画像と同じにするように強制しているようです。画像を渡してuint8も、float32ヒストグラムの値が 255 より大きい場合、逆投影画像が切り取られる可能性があります。

これを行う最も健全な方法は、スケール = 1.0 を維持するように見えますが、float32画像を に渡しcalcBackProjectます。

backProj = cv2.calcBackProject([im_converted.astype('float32')], channels, hist, ranges,scale)

もう 1 つの方法は、uint8画像を渡しますが、スケールを に設定すること255. / hist.max()です。したがって、逆投影画像の 255 は、最も頻繁に使用される色に対応します。

于 2013-03-01T18:16:51.270 に答える