C#で画像をNumpy配列に変換する方法
C#でPythonのNumpy配列を使えるライブラリがありますが、C#で画像をNumpy配列化するときに少し大変だったのでメモとして書いておきます。
目次
環境構築
Visual Studio 2019、.NET Core 2.1のコンソールアプリケーションを想定します。
NuGetから、「Numpy」をインストールしておきます。他にもNumSharpというライブラリがありますが、今回はNumpyを使います。
https://github.com/SciSharp/Numpy.NET
64ビットでビルドするようにします。「ビルド」→「構成マネージャー」から、「アクティブ ソリューション プラットフォーム」で「x64」を指定します。プラットフォームが変わることで、カレントディレクトリが変わるので注意が必要です。
基本的なNumpyの使い方
まずはNumpyライブラリの使い方から見ていきましょう。ほとんどPython版と同じです。
行列の作成
例えば3×3の連番の行列を作るのなら、
スライスだけ注意
「x[2:3]」のようなスライスはC#だと定義できないので、文字列キャストします。ただし、一部対応していないスライスもあるので、Numpy関数で置き換える必要があります。
画像のByte配列化
Pythonでは一瞬のことでも
この記事の目標は、カラー画像ファイルを
または、
でOKです。これをC#で実装するだけでも結構面倒なのです。
Byte配列にする
まずは、画像をByte配列にします。これをuint8の(C#のByteとNumPyのuint8は同じ)np.arrayして加工していく方針です。
https://gist.github.com/ksasao/f841b85d7521f49306fb
こちらのコードを活用させていただきます。
バイト配列の構造を知る
2×2の簡単な画像
まずは2×2の簡単な画像を用意して、できたByte配列がどのような構造になっているか確認します。
https://blog.shikoan.com/wp-content/uploads/2020/12/sample_22.png
2×2の小さな画像です。見えないので引き伸ばして可視化します。
それぞれのカラーコードがByte配列でどう対応しているかを確認します。
Byte配列との対応
結果は次のようになります。
これを解釈していくと次のようになります。透明要素はないのでAは必ず255です。
まとめると、
- 左上から横方向に、下に向かってピクセルが4バイトで格納されている。
- RGBは反転してB, G, Rで格納されている。それにAが合わさって1ピクセルとなっている。
これをRGBの3チャンネルの配列にするのは、Numpy関数を使えばそこまで難しくありません。
画像をNumPy配列化する
これをLoadImageという関数にまとめると次のようになります。
結果は次の通り。
これでやっと画像をNumpy配列としてC#で読み込むことができました。
Pythonだと一瞬の処理を、ライブラリが整備されていない環境で再現しようとすると思わぬ大変さがあります。「Pythonって楽でいいな」という有り難みを感じざるを得ませんね。
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー