Categories: C#

OpenCvSharp でRGB要素別々で二値化する

OpenCvSharpで、画像を二値化する方法はグレースケールしてから、Cv.Thresholdで二値化します。

        //using OpenCvSharp;
        private IplImage getBinImage()
        {
            //元の画像を読込
            IplImage img = new IplImage("test.jpg");

            //二値化画像を保存するIplImageの準備
            IplImage bin_iplImg = new IplImage(img.Width, img.Height, BitDepth.U8, 1);

            //閾値
            int threshould = 180;

            //グレースケールに変換
            img.CvtColor(bin_iplImg, ColorConversion.BgrToGray);
            //二値化処理
            Cv.Threshold(bin_iplImg, bin_iplImg, threshould, 255, ThresholdType.Binary);
            return bin_iplImg;
        }

 

でも、RGB各要素で閾値を変えたい場合、たとえば、緑成分の多い画像を処理したい時などには次のようにします。

        
        //using OpenCvSharp;
        IplImage getBinImage2()
        {
            //元の画像を読込
            IplImage img = new IplImage("test.jpg");

            //二値化画像を保存するIplImageの準備
            IplImage bin_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);

            //RGB要素のIplImageの準備
            IplImage r_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
            IplImage g_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
            IplImage b_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);

            //元画像をRGBに分解
            Cv.Split(img, b_iplImg, g_iplImg, r_iplImg, null);

            //RGB各要素の閾値
            int r_threshold = 180;
            int g_threshold = 230;
            int b_threshold = 150;

            // 各RGB要素で閾値以下のピクセルを抽出する
            Cv.Threshold(r_iplImg, r_iplImg, r_threshold, 255, ThresholdType.BinaryInv); 
            Cv.Threshold(g_iplImg, g_iplImg, g_threshold, 255, ThresholdType.BinaryInv); 
            Cv.Threshold(b_iplImg, b_iplImg, b_threshold, 255, ThresholdType.BinaryInv); 

            // ORでRGB要素を合算
            Cv.Or(b_iplImg, g_iplImg, bin_iplImg, null);
            Cv.Or(bin_iplImg, r_iplImg, bin_iplImg, null);

            return bin_iplImg;
        }
nakaike