I記憶された画像は、リードスルーcv2.imread
配列内masks
。アレイの形状です(10, 5248, 7936, 3) (10 images, image height, image width, 3 channels)
。
私は今、この配列をコピーするが、値にリサイズすべての画像にしようとしていますmonitor_h
とmonitor_w
。ここで私が持っているものです。
resized_masks = np.empty([masks.shape[0], monitor_h, monitor_w, masks.shape[3]])
for i in range(masks.shape[0]):
resized_masks[i] = cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h))
しかし、私はから取得する画像はcv2.imshow
黒と白です。何かがチャンネルを起こっている必要があります。任意のリード?
あなたのイメージは黒と白の出てきている理由を確認するには、コードを通してのステップをしましょう。
resized_masks = np.empty([masks.shape[0], monitor_h, monitor_w, masks.shape[3]])
この行は、型の配列を作成しnp.float
、デフォルトでは。
resized_masks[i] = cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h))
この行は、結果割り当てcv2.resize
のスライスにしますresized_masks
。
あなたのオリジナルの画像、およびのため、結果はcv2.resize
、おそらくタイプですnp.uint8
。割り当てはに値をキャストfloat
バッファに入れてS。キャストは、それ自体の罰金です:5
への変換5.0
、255
に変換255.0
。問題は、あるfloat
値が範囲にクリップされるものとして解釈され[0.0, 1.0]
、ではありません[0.0, 255.0]
。そのため、彼らは正しい値どのように見えるかを含んでいても、効果的にすべての0と1にあるイメージになってしまいます。
あなたは値が表示して正しいことを確認することができます
resized_masks.astype(masks.dtype)
これが本当の修正はありません。本当の修正は、正しい出力タイプを開始することです:
resized_masks = np.empty((masks.shape[0], monitor_h, monitor_w, masks.shape[3]), dtype=masks.dtype)
それは形ではなく、リストのタプルを使用する従来のですが、それは問題で機能しないことに注意してください。
今すぐあなたの理由での見てみましょうパッチが働いていました。
resized_masks = list(resized_masks)
これは、各サブアレイへの参照のPythonのリストを作成します。あなたが本当にスライスされているので、彼らはまだボンネットの下に連続したバッファを指しますが、重要なことは、それぞれがあることであるresized_masks[i]
同じ配列オブジェクトへの別個の基準ではなく、スライスです。
resized_masks[i] = list(cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h)))
ためresized_masks
の参照を含むリストであり、これは今の結果代入さcv2.resize
にi
番目リスト要素、適切なサイズのスライスにコンテンツを割り当てません。あなたは必要としないlist
、それが不要な次元を導入して、ここではラッパーを。
resized_masks = np.asarray(resized_masks)
すべての要素が(上記のようにあなたは、余分な単位寸法が表示されますが)正しいサイズであるため、これは単に、配列にリストを再結合します。あなたが想像できるように、このソリューションは非常に非効率的です。あなたがリストにしてから行くと、複数の不要なバッファを割り当てているという事実の上に、あなたはまた、元の破棄されnp.empty
、それを使用せずに配列を。
あなたのパッチがやっとほぼ同等です
resized_masks = np.array([cv2.resize(np.copy(mask), (monitor_w, monitor_h)) for mask in masks])
私はそのようにそれをやってお勧めしません。