OpenCVSharp4で色々な前処理フィルタを試してみた

はじめに

撮影した画像を見やすくする前処理として有名な
「膨張」「縮小」「オープン」「クローズ」「平均値」「ガウシアン」「中央値(メディアン)」「バイラテラル」フィルタを使ってみた

手順

  1. VisualStudioにOpenCVSharp4とOpenCVSharp4.runtime.winをインストール

  2. 以下のプログラムを実行

using System;  
using OpenCvSharp;  

namespace 基本的な前処理 {  
    class Program {  
        static void Main(string[] args) {  
            Mat src = new Mat(@"D:\icon.jpg");  
            Mat erode = new Mat(),  
                dilate = new Mat(),  
                opening = new Mat(),  
                closing = new Mat(),  
                blur = new Mat(),  
                gaussian = new Mat(),  
                median = new Mat(),  
                bilateral = new Mat();  

            Cv2.CvtColor(src, src, ColorConversionCodes.RGB2GRAY);//入力画像をグレースケールに変換  

            /* 膨張と縮小  
             * GetStructuringElement()で構造を作成する  
             * MorphShapesはRectで矩形、Crossで十字形、Ellipseで楕円のstructuring elementを作成できる  
             */  
            Cv2.Erode( src,  erode, Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5,5)));  
            Cv2.Dilate(src, dilate, Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5,5)));  


            /*オープニングとクロージング  
             * どちらもMorphTypesから指定する  
             * structuring elementsの作成は「膨張」や「縮小」と同じ  
             */  
            Cv2.MorphologyEx(src, opening, MorphTypes.Open , Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5)));  
            Cv2.MorphologyEx(src, closing, MorphTypes.Close, Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5)));  


            //平均値ぼかし  
            Cv2.Blur(src, blur, new Size(5, 5));  


            /*ガウシアンフィルタ  
             * カーネルの標準偏差sigmaを指定できる。  
             * ただしsigmaが0のときは標準偏差が自動計算される。  
             */  
            double sigma = 0;  
            Cv2.GaussianBlur(src, gaussian, new Size(5, 5), sigma);  


            /*中央値フィルタ  
             * カーネルのサイズは1辺の長さを指定すればいい  
             * ただし辺の長さは奇数にする必要がある  
             */  
            Cv2.MedianBlur(src, median, 5);  


            /*バイラテラルフィルタ  
             * dは各ピクセル近傍の直径(0のとき自動計算)  
             * 色空間の分散  
             * 座標空間の分散  
             */  
            int d = 5;  
            double sigmaColor = 75;  
            double sigmaSpace = 75;  
            Cv2.BilateralFilter(src, bilateral, d, sigmaColor, sigmaSpace);  

            //画像の表示  
            Cv2.ImShow("src"      , src);  
            Cv2.ImShow("erode"    , erode);  
            Cv2.ImShow("dilate"   , dilate);  
            Cv2.ImShow("opening"  , opening);  
            Cv2.ImShow("closing"  , closing);  
            Cv2.ImShow("blur"     , blur);  
            Cv2.ImShow("gaussian" , gaussian);  
            Cv2.ImShow("median"   , median);  
            Cv2.ImShow("bilateral", bilateral);  

            Cv2.WaitKey();  
            Cv2.DestroyAllWindows();  

        }  
    }  
}  

 

参考

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_filtering/py_filtering.html#filtering

https://algorithm.joho.info/programming/image-processing/

https://docs.opencv.org/4.0.0/

https://github.com/shimat/opencvsharp