今回は、OpenCvSharpを使った簡単な画像処理を実践していきたいと思います。
グレースケールや2値化などの基本となる部分の解説になるので、初めて画像処理をされる方や、OpenCvSharpを初めて触るという方の参考になればと思います。
「ココナラ」でC#、OpenCvSharpを使った画像処理アプリの作成を行っています。
もし、作成依頼やお困りごとがあればお気軽にご相談ください!

動作環境
Windows10
VisualStudio2019
OpenCvSharp4
前準備
Visual Studio 2019のインストール
下記にインストール方法をまとめたので参考にしてください。

OpenCvSharpのインストール
下記にインストール方法をまとめたので参考にしてください。前準備にインストール方法が記載してあります。

ソースコードと解説
処理内容
①保存されている画像を読込み②グレースケール化③2値化を行うというシンプルなものとなります。
今回用意している元画像がこちらになります。

ソースコード
こちらが処理結果の画像です。左が元画像、真ん中がグレースケール画像、左が2値化画像(閾値:100)となります。

まずは全体のソースコードを載せていきます。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//以下、OpenCvsharpの使用とMatの変換用として追加
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace ImageProcessing
{
public partial class Form1 : Form
{
private Mat _image;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//PictureBoxのサイズに合わせて表示
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
}
private void button1_Click(object sender, EventArgs e)
{
//画像の読込み
_image = Cv2.ImRead(@"C:\coffee.jpg");
pictureBox1.Image = BitmapConverter.ToBitmap(_image);
}
private void button2_Click(object sender, EventArgs e)
{
//グレースケール化
var grayImage = _image.CvtColor(ColorConversionCodes.BGR2GRAY);
//PictureBoxに表示 MatをBitMapに変換
pictureBox2.Image = BitmapConverter.ToBitmap(grayImage);
//2値化(100を閾値として2値化)
var thresholdImege = grayImage.Threshold(int.Parse(textBox1.Text), 255, ThresholdTypes.Binary);
pictureBox3.Image = BitmapConverter.ToBitmap(thresholdImege);
}
}
}
次に、詳細の解説をしていきます。
画像の読込み
画像の読み込みはCv2.Imreadにて行います。引数は画像のパスを入力します。
private void button1_Click(object sender, EventArgs e)
{
//画像の読込み
_image = Cv2.ImRead(@"C:\coffee.jpg");
pictureBox1.Image = BitmapConverter.ToBitmap(_image);
}
グレースケールと2値化
「変換ボタン」を押下することにより、元画像をグレースケール化し、グレースケール化した画像を2値化します。
グレースケール:CvtColor関数
2値化:Threshold関数
2値化する前にはグレースケール化しなければなりません。セットで覚えておきましょう。
グレースケール化した値は0-255までの数値となります。各Pixel毎に0-255までの数値が入っており、その値が100以下の場合は0、100より大きい場合は255となります。
0が黒、255が白となります。
private void button2_Click(object sender, EventArgs e)
{
//グレースケール化
var grayImage = _image.CvtColor(ColorConversionCodes.BGR2GRAY);
//PictureBoxに表示 MatをBitMapに変換
pictureBox2.Image = BitmapConverter.ToBitmap(grayImage);
//2値化(100を閾値として2値化)
var thresholdImege = grayImage.Threshold(int.Parse(textBox1.Text), 255, ThresholdTypes.Binary);
pictureBox3.Image = BitmapConverter.ToBitmap(thresholdImege);
}
参考
2値化の閾値を変更すると画像が以下のように変化します。
2値化閾値:30
白い部分が大幅に増えていることが分かると思います。

2値化閾値:200
こちらは、黒い部分が大幅に増えていることが分かると思います。

まとめ
以上がOpenCvSharpを使った画像処理の基本、グレースケール、2値化のやり方です。
OpenCvSharpには他にも様々な関数があります。
今後もOpenCvSharpを使った画像処理の解説をしていこうと思いますので、是非見ていただけたらと思います!
最後までご覧いただき、ありがとうございました!
C#で画像処理を学ぶためのおススメの書籍
C#でOpenCvを扱う方法などを詳しく解説してくれています。
C#で画像処理を解説してくれている本がほとんどない中、こちらの書籍はいろいろなメソッドの使い方等を事例を交えて解説してくれているため、非常に参考になります。
私はこちらの書籍を参考に画像処理を実装しました。
是非参考にしてみてください。
C#の基本が学習したいという方におススメのスクール:侍エンジニア塾のエキスパートコース