LoginSignup
5
3

More than 5 years have passed since last update.

OpenCVで読み込んだ画像をChainer用に変換し、それを再びOpenCV用に変換するメモ

Posted at

深層学習において、分類問題でなく画像を出力とした場合を想定している。画像を出力にした場合にはそのままではOpenCVで可視化できない。

動作環境

  • Ubuntu 16.04
  • Python 3.5.2
  • Chainer 3.2
  • numpy 1.13.3
  • opencv-python 3.2

画像をChainerの入力にするために変換する

OpenCVで画像を読み込むと縦、横、色数の順で構成された行列となっているが、Chainerで利用する時は色数、縦、横に変換する必要がある。さらに形式をuint8からfloat32にする必要がある。

def img2arr(imgs, norm=255, dtype=np.float32, gpu=-1):
    """
    入力画像リストをChainerで利用するために変換する
    [in]  imgs:  入力画像リスト
    [in]  norm:  正規化する値(255であれば、0-255を0-1に正規化する)
    [in]  dtype: 変換するデータタイプ
    [in]  gpu:   GPUを使用する場合はGPUIDを入力する
    [out] 生成された行列
    """

    shape = imgs[0].shape
    w, h = shape[:2]
    if(len(shape) == 2):
        ch = 1
    else:
        ch = shape[2]

    if(gpu >= 0):
        return xp.array(imgs, dtype=dtype).reshape((-1, ch, w, h)) / norm
    else:
        return np.array(imgs, dtype=dtype).reshape((-1, ch, w, h)) / norm

Chainerの出力を表示するために変換する

先ほどとやっていることは同じだが、dtypeをuint8にするタイミングに注意が必要。1行で同時に処理しようとすると0と255のみで構成される画像として変換されてしまうため注意が必要。

def arr2img(arr, ch, size, norm=255, dtype=np.uint8):
    """
    Chainerの出力をOpenCVで可視化するために変換する
    [in]  arr:   Chainerから出力された行列
    [in]  ch:    画像に変換する際のチャンネル数
    [in]  size:  画像に変換する際の画像サイズ
    [in]  norm:  正規化をもとに戻す数(255であれば、0-1を0-255に変換する)
    [in]  dtype: 変換するデータタイプ
    [out] OpenCV形式の画像に変換された行列
    """

    y = np.array(arr).reshape((-1, size, size, ch)) * 255
    return np.array(y, dtype=np.uint8)

もっといい方法があればコメントください。

5
3
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
5
3