Categories: C#

C# 二値化した画像をGraphicsで扱えるようにする

C# 二値化した画像をGraphicsで扱えるようにする」で二値化した画像に、赤枠をつけたりしたいと思って、Graphicsで処理しようとすると、「グラフィック オブジェクトをインデックス付きピクセル形式を持つイメージから作成できません」と怒られます。

        void test()
        {

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

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

            //閾値
            int threshould = 180;

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

            //Bitmapを取得
            Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(img);

            //ここで、「グラフィック オブジェクトをインデックス付きピクセル形式を持つイメージから作成できません」と怒られる
            Graphics g = Graphics.FromImage(bmp);

            //赤線で囲む
            Pen pen = new Pen(Color.FromArgb(150, Color.Red), 10);
            g.DrawRectangle(pen, 0, 0, bmp.Width, bmp.Height);

            g.Dispose();
            pen.Dispose();
            pictureBox_scanData.Image = bmp;
        }

どうやら、二値化した画像は、Format1bppIndexedなのでダメということのようで。
https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.fromimage(v=vs.110).aspx

じゃ、どうするか考えたのですが、GetThumbnailImageを使えば、さくっと解決できます。

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

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

            //閾値
            int threshould = 180;

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

            //Bitmapを取得
            Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(img);

            //GetThumbnailImageを利用して変換
            Image image = bmp.GetThumbnailImage(bmp.Width, bmp.Height, new Image.GetThumbnailImageAbort(dummy), IntPtr.Zero);

            //GetThumbnailImageをつかって変換しておけば大丈夫
            Graphics g = Graphics.FromImage(image);

            //赤線で囲む
            Pen pen = new Pen(Color.FromArgb(150, Color.Red), 10);
            g.DrawRectangle(pen, 0, 0, bmp.Width, bmp.Height);

            g.Dispose();
            pen.Dispose();
            pictureBox_scanData.Image = bmp;
        }

 

nakaike