3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像ファイルのIOにOpenCVを使うのは正解だろうか

Last updated at Posted at 2024-09-14

はじめに

最近、画像認識・機械学習のアルゴリズム開発にscikit-learn, scikit-image, pytorch, tensorRTなどを使っているせいか、OpenCVの機能を使ってコーディングする機会が減っている。

使っている機能

  • cv2.imread()
  • cv2.imwrite()
  • cv2.imshow()
  • cv2.VideoCapture()
  • cv2.VideoWriter()

opencv のうれしくない点

  • opencv はBGR の順序となっているためにRGBを想定しているライブラリとの相性が良くない。
  • Unicode 文字列の描画をサポートしていない。

opencv がらみの心配

どのwhl を入れたらいいのか

  • opencv-python
  • opencv-contrib-python
  • opencv-python-headless
  • opencv-contrib-python-headless

headlessを利用する場合

  • imshowなどのGUIを必要としない場合に選ぶ。
  • opencv-python と opencv-python-headless が同時に含まれている状況を作ってはならない。
    どちらか一つを残すこと。
  • GUIが不要な場合: opencv-python-headless
  • GUIが必要な場合: opencv-python

opencv-contrib-pythonを利用する場合

他のライブラリとの適合性の問題

  • numpy
  • scikit-learn
  • 他の商用ライブラリ
    OpenCVへの依存ライブラリが多いので、循環import問題を生じやすくなっている。

AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' (most likely due to a circular import)

OpenCVへの依存ライブラリ、Numpyへの依存ライブラリが多いので、許容されるバージョンの組合せが少なくなる問題。

他のライブラリ

imageio

  • imageio.imread()
  • imageio.imwrite()
    np.ndarray 型の戻り値です。
    画像の表示はない。

scikit-image

https://scikit-image.org/docs/stable/api/skimage.io.html
imread()
imsave()
np.ndarray 型の戻り値です。

scikit-imageのうれしいところ

  • 画像のnp.float での処理をサポートしている点
  • dtype=np.float 型での演算や画像の表示機能が充実しているので、opencv ではできない処理もできることが多い。

PIL Image(pillow)

読み込んだあとのデータ形式がnp.ndarray型にとは異なるライブラリです。
テキストの画像への書き込むがASCIIの範囲に限らない。

現状の私の指針

  • scikit-image, imageio, Pillow のいずれかをimport しているプロジェクトで、画像ファイルのIOにしか用いていない状況では、OpenCVを使わない。
     imageIOはPillowを利用する。scikit-imageはimageIOを利用する。
     そのため、imageIOのimreadを使った方が、OpenCVを追加しない分だけ簡潔になる。

  • 動画ファイル、GStreamerを用いているときは、必ずOpenCVを使う。

  • それ以外の適切なライブラリを知らない。

追記:

def some_func(img: np.ndarry) -> np.ndarray:
とは書かず、
def some_func(rgb_img: np.ndarry) -> np.ndarray:
もしくは
def some_func(bgr_img: np.ndarry) -> np.ndarray:
と書くように心がけている。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?