【WPF】OpenCV を使って グレースケール化する

Uncategorized
407 words

OpenCV を使って 画像をグレースケール化します。

WPF OpenCV グレースケール化

実装手順

NuGet から「OpenCvSharp4」パッケージを入れる

  • OpenCvSharp4
  • OpenCvSharp4.runtime.win
  • OpenCvSharp4.Windows
  • OpenCvSharp4.WpfExtensions

OpenCvSharp4

XAML

「MainWindow.xaml」に Image コントロールを置いて名前を「image」にします。

1
<Image Name="image"/>

グレースケール化する処理

ボタンのイベントで下記処理が実行されるようにします。

1
2
3
4
5
6
7
8
9
10
// Image コントロールから画像データを BitmapSource 形式で取得する。
var bitmapSource = (BitmapSource)image.Source;
// BitmapSource 形式を OpenCV の Mat 形式に変換する。
var mat = OpenCvSharp.WpfExtensions.BitmapSourceConverter.ToMat(bitmapSource);
// OpenCV で グレースケール化する。
OpenCvSharp.Cv2.CvtColor(mat, mat, OpenCvSharp.ColorConversionCodes.RGB2GRAY);
// OpenCV の Mat 形式を BitmapSource 形式に変換する。
var bitmapSource_gray = OpenCvSharp.WpfExtensions.BitmapSourceConverter.ToBitmapSource(mat);
// Image コントロールに BitmapSource 形式の画像データを設定する。
image.Source = bitmapSource_gray;

Cv2.CvtColor の 第3引数で 変換形式を指定できます。

今回はグレースケール化したかったので「RGB2GRAY」にしました。

「RGB を GRAY にする」みたいな意味合いでしょうね。きっと。

ちなみに「RGB2GRAY」の「2」って英語の「To」を意味しているんだと思います。発音が似ていますもんね。

もちろんモノクロで保存できます。

OpenCvSharp.ColorConversionCodes.RGB2GRAY

失敗したこと

Cv2.CvtColor の 第3引数 で何を選んでいいのか分からなかったです。

例えば適当に「ColorConversionCodes.GRAY2RGBA」を選んだらこんなエラーになりました。

エラー

OpenCvSharp.OpenCVException: ‘> Invalid number of channels in input image

そんなチャンネルねーよ。

よく理解していなかった私が悪いので、ちゃんと読んで理解したら自ずと指定するものが分かりました。

教訓

適当にし過ぎないこと。

GitHub

ソースコード