2017-10-11 106 views
0

特定のグレースケール画像を表す特定のnp.array データがあります。 私はSimpleBlobDetector()を使用する必要があります。残念なことに8ビットイメージしか受け付けないので、このイメージを変換する必要があります。明らかに品質の低下があります。float64型のnp.arrayをuint8の倍率値に変換する

私はすでに試した:予想通り

import numpy as np 
import cv2 
[...] 
data = data/data.max() #normalizes data in range 0 - 255 
data = 255 * data 
img = data.astype(np.uint8) 
cv2.imshow("Window", img) 

しかしcv2.imshowは終わりでは...しかし、奇妙な歪みと、

をイメージを与えていない、私はする必要がありnp.float64をnp.uint8に変換してすべての値をスケーリングし、残りの部分を切り捨てる。 65535は255になり、65534は254になります。

ありがとうございました。

+1

どのような奇妙な歪みが起こっていますか?私には、正規化コードはうまくいくようです。 'data'の型は' np.float64'ですか?また、65535を255に変換すると、予想される入力タイプは 'np.float64'ではなく' np.uint16'と思われます。 – rayryeng

+0

画像に細かい粒度があるように見えます。たとえば、黒い背景が灰色で不定形(???)になります。 代替候補がありますか? – decadenza

+0

イメージの最大値ではなく、そのタイプが経験する最大値でイメージを分割することをお勧めします。私は答えを書いた。それが動作するかどうか私に教えてください。 – rayryeng

答えて

1

イメージを正規化するより良い方法は、各値を取り、データ型が経験する最大値で割ることです。これにより、画像内のダイナミックレンジの小さい画像は小さく、灰色になるように誤って正規化されることはありません。たとえば、画像のダイナミックレンジが[0-2]の場合、コードは今度は、輝度が[0, 128, 255]になるようにスケールします。 np.uint8に変換した後、これらの値を小さくしておきたいとします。

したがって、実際の画像そのものではなく、画像タイプで可能な最大値で各値を除算します。これを255でスケーリングし、正規化された結果を生成します。 numpy.iinfoを使用し、画像のタイプ()を入力すると、そのタイプの情報構造が得られます。この構造からmaxフィールドにアクセスして、最大値を決定します。

したがって、上記のと、自分のコードに次の変更を行います。着信データ型はそうではなく、浮動小数点を維持する場合には、私はさらにnp.float64に画像を変換しました

import numpy as np 
import cv2 
[...] 
info = np.iinfo(data.dtype) # Get the information of the incoming image type 
data = data.astype(np.float64)/info.max # normalize the data to 0 - 1 
data = 255 * data # Now scale by 255 
img = data.astype(np.uint8) 
cv2.imshow("Window", img) 

注意分割を行う際の精度。

+0

の範囲の値を正規化し、あなたの答えに感謝します。あなたのコードでは* info.max *ではなく* info.max()*(それは呼び出し可能ではありません)と思われます。 コードが機能しています。 @Schneems。 – decadenza

+0

提案した変更が間違っています。それは 'info.max'でなければなりません。 'info.max'は定数であり、関数ではありません。一人で放置してください。 – rayryeng

+0

ああ、申し訳ありません。私は今それを見る。私は@decadenzaと私はどちらも関数である画像自体に.max()を呼び出していたと思います。また、cv2関数cv2.normalizeがあることにも注目してください。 – Schneems

関連する問題