web-dev-qa-db-ja.com

cv2を使用して(dtype = boolで)バイナリイメージを保存する方法

pythonでopencvを使用していて、バイナリイメージ(dtype = bool)を保存したいのですが、単にcv2.imwriteを使用すると、次のエラーが発生します。

TypeError: image data type = 0 is not supported

誰かがこれを手伝ってくれますか?画像は基本的に後でマスクとして機能することになっています。

9
Vaibhav Dixit

あなたはこれを使うことができます:

cv2.imwrite('mask.png', maskimg * 255)

したがって、これは暗黙的に整数に変換されます。これにより、Falseに0、Trueに1が与えられ、255で乗算されて(ビット)マスクが作成されます。 OpenCVは非常に寛容であり、int64 8ビット深度の画像(例:uint16 16ビット深度の画像)。操作はnotで行われるため、maskimgを使用してインデックス作成などを行うことができます。

9
John

バイナリイメージを 'uint8'データ型に変換します。

これを試して:

>>> binary_image.dtype='uint8'
>>> cv2.imwrite('image.png', binary_image)
3
avereux

いいえOpenCVは、ブールndarrayの形式のバイナリイメージを想定していません。 OpenCVnp.uint8np.float32np.float64のみをサポートします。OpenCVは画像操作ライブラリに近いため、ブール値を持つ画像は、 RGBまたはグレースケール形式。

バイナリマトリックスを格納するための最もコンパクトなデータ型はucharまたはdtype=np.uint8であるため、np.boolの代わりにこのデータ型を使用する必要があります。

1
ZdaR

OpenCVを使用している場合は、画像の脱穀にhsv形式の使用を検討する必要があります。 cv2.cvtColor()を使用してBGRイメージをHSVに変換し、cv2.inRange()関数を使用してイメージにしきい値を設定します。

Hue(h)、Saturation(s)、Value(v)の上限と下限の値が必要になります。このためには、 このスクリプト を使用するか、それを参照として使用して独自に作成します。

このスクリプトは、ライブビデオストリーム入力のhsv下限値と上限値を返すことを目的としていますが、少し調整するだけで、画像入力でも同じことができます。

取得したバイナリ(種類)画像をcv2.imwrite()を使用して保存します。このバイナリイメージをマスキングにも使用できます。それでも疑問が残っている場合は、 このスクリプト を参照すると、ほとんどの問題が解決されます。

0
Ajay Jha
ndarray.astype('bool')

このページを参照してください。

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html

0
Nathan