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

実装手順
NuGet から「OpenCvSharp4」パッケージを入れる
- OpenCvSharp4
- OpenCvSharp4.runtime.win
- OpenCvSharp4.Windows
- OpenCvSharp4.WpfExtensions

XAML
「MainWindow.xaml」に Image コントロールを置いて名前を「image」にします。
<Image Name="image"/>
グレースケール化する処理
ボタンのイベントで下記処理が実行されるようにします。
// 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」を意味しているんだと思います。発音が似ていますもんね。
もちろんモノクロで保存できます。

失敗したこと
Cv2.CvtColor の 第3引数 で何を選んでいいのか分からなかったです。
例えば適当に「ColorConversionCodes.GRAY2RGBA」を選んだらこんなエラーになりました。

OpenCvSharp.OpenCVException: ‘> Invalid number of channels in input image
そんなチャンネルねーよ。
よく理解していなかった私が悪いので、ちゃんと読んで理解したら自ずと指定するものが分かりました。
教訓
適当にし過ぎないこと。