Select Color

カラー画像から選択された色を抽出します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. image.cs のソースコードは Delete Color を参照して下さい。
    画像を解析する時に、目的の色に絞り込むと解析が容易になります。
    そこでマウスクリックで選択された座標からピクセルを構成する3原色を取得して、目的の色に絞り込みます。
    Delete Color と逆の機能でしょうか。
    青色(B)の8ビット 緑色(G)の8ビット 赤色(R)の8ビット
    このときネックになるのが「対象となる物体は微妙に色が変化する」ことです。
    そこで色の範囲を指定する閾値(しきいち)のパラメータを使います。
  2. プログラムを起動すると "抽出する色を選択して下さい" のメッセージが表示されます。
    マウスの左クリックで色を選択して下さい。
    このとき画像の DPI が標準(96)以外だと座標が合わない場合があるので、Debug.Write() の印字で確認して下さい。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g;
            string   str;
    
            g = e.Graphics;
            if (App.bmp == null)    Application.Exit();
            App.View(g,0,0);
            if (xp==0)  MessageBox.Show("抽出する色を選択して下さい");
            else
            {
                str = "v:" + val + " [" + xp + "," + yp + "]";
                this.Text = str;
            } 
        }
    
  3. 続けて左クリックすると、閾値をアップしながら Sel_Color() 関数を呼び出します。
    閾値(しきいち)が大きくなるほど黒い部分が少なくなってカラーの部分が増えます。
    マウスの右クリックで、元のカラー画像に戻ります。
        int     xp=0, yp=0;
        int     val= 30;
    
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {   if (e.Button == MouseButtons.Left)  //マウスの左ボタン
            {   if (xp==0)
                {   xp= e.X;
                    yp= e.Y;
                }
                else
                {   App.LoadImage();
                    val+= 4;
                    App.Sel_Color(xp,yp,val);
                }
            }
            if (e.Button == MouseButtons.Right) //マウスの右ボタン
            {   App.LoadImage();
                xp= 0;
                val= 30;
            }
            Invalidate();
        }
    
  4. C#のプログラムは、C言語を使って作成する場合に比べて非常に簡単です。
    C言語のプログラムは Select Color を参照して下さい。
    X,Y 座標で指定された色を抽出する関数です。
    SetLimit(xp,yp,wd) 関数で X,Y 座標から RGB を取得して、色の下限と上限を設定します。
    ChkPic() が X,Y 座標のピクセルが閾値の範囲内か超えているかを判定する関数で、範囲外の色を Black にします。
        public  Color   cor_L;          //対象となる Color の範囲
        public  Color   cor_H;
    
        // 画像から xp,yp で指定された色を抽出する関数
        public void  Sel_Color(int xp, int yp, int wd)
        {   if (bmp == null)    return;
            SetLimit(xp,yp,wd);
            for(int y=0; y<bmp.Height; y++)
                for(int x=0; x<bmp.Width; x++)
                {   if (ChkPic(x,y)==false) bmp.SetPixel(x,y,Color.Black);  }
        }
    
  5. 色の下限と上限を設定する SetLimit() 関数と X,Y 座標のピクセルが閾値を超えているかを判定する ChkPic() 関数は Delete Color を参照して下さい。

[Next Chapter ↓] Color ⇒ エッジ画像
[Previous Chapter ↑] Delete Color

超初心者のプログラム入門(C# Frame Work)