SKProgramLab

Let's Enjoy Programming! ~画像処理/IoT/機械学習など~

C#/VB.NETで画像処理③<画像をぼかす(平滑化)>

こんにちは、SKです。
f:id:SKProgramLab:20200310203357p:plain:w100

C#/VB.NETで画像処理シリーズの第3弾。
カメラの画像をぼかす(=平滑化)処理をかけていきます。

OpenCVSharpとは?

skprogramlab.hatenablog.com

カメラ画像取得プロジェクト

skprogramlab.hatenablog.com

動画手順

youtu.be

①画像処理用の関数を追加する

カメラ画像を加工する関数”Process”を追加します。引数に画像データ"img"を渡します。Mat型の引数は自動的に参照渡しになるので、後はこのimgを加工していくだけで、PictureBoxにその画像が表示されます。 f:id:SKProgramLab:20200403210707p:plain

②GaussianBlurでぼかす

OpenCVには平滑化処理がいくつか用意されていますが、代表的なGaussianBlur(ガウシアンブラー)を使います。

GaussianBlur関数

http://opencv.jp/opencv-2svn/cpp/imgproc_image_filtering.html#cv-gaussianblur
・第1引数:入力画像(Mat)
・第2引数:出力画像(Mat)
・第3引数:カーネルサイズ=ぼかしの強さ(Size型、正の奇数を指定)
・第4引数:0でOK

private void Process(Mat img)
{
    Cv2.GaussianBlur(img, img, new Size(31, 31), 0);
}

f:id:SKProgramLab:20200403212743p:plain
実行します。
f:id:SKProgramLab:20200403212437p:plain
画像全体が強めにぼかされました。
超簡単!このように、様々な画像の加工を関数1つ呼ぶだけで実現できるのがOpenCVというライブラリです。

最後に、コード全文を載せておきます。
C#

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                using (VideoCapture v = new VideoCapture(0))
                using (Mat img = new Mat())
                {
                    while (true)
                    {
                        v.Read(img);
                        Process(img);
                        pictureBox1.Image = BitmapConverter.ToBitmap(img);
                    }
                }
            });
        }

        private void Process(Mat img)
        {
            Cv2.GaussianBlur(img, img, new Size(31, 31), 0);
        }

    }
}


VB.NET

Imports OpenCvSharp
Imports OpenCvSharp.Extensions

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Task.Run(Sub()
                     Using v As New VideoCapture(0)
                         Using img As New Mat
                             Do
                                 v.Read(img)
                                 Process(img)
                                 PictureBox1.Image = img.ToBitmap
                             Loop
                         End Using
                     End Using
                 End Sub)
    End Sub

    Private Sub Process(ByVal img As Mat)
        Cv2.GaussianBlur(img, img, New Size(31, 31), 0)
    End Sub

End Class