Select Color

画像から X,Y 座標で指定された色以外を削除します。

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

指定された色以外を削除

  1. 画像を解析する時に、目的の果物だけに絞り込むと解析が容易になります。
    そこで指定された X,Y 座標のピクセルを元に、果物の色以外を削除して描画します。
    Delete Color と逆の機能でしょうか。
    青色(B)の8ビット 緑色(G)の8ビット 赤色(R)の8ビット
    このときネックになるのが「対象となる果物は微妙に色が変化する」ことです。
    そこで色の範囲を指定する閾値のパラメータを使います。
  2. X,Y 座標で指定された果物に絞り込む関数です。
    SetLimit(x,y,wd) 関数で X,Y 座標から RGB を取得して、果物の色の下限(low)と上限(high)を設定します。
    下限と上限の範囲に含まれるピクセルを残して、ゼロに置き換えます。
    SetLimit(x,y,wd) 関数, ChkPic() 関数は Delete Color のときに説明しています。
    プログラムを動かすと解るのですが、画像の座標と Dib のピクセル配置は上下が反転しています。
    // Dib 画像から X,Y で指定された色を抽出する関数
    void  IMAGEAI::Sel_Color(int xp, int yp, WORD wd)
    {   int     x, y;
    
        Show(Dib.hBmpDC, 0, 0);
        SetLimit(xp,yp,wd);
    VarMsg(hWnd,"WORD WD:",wd);
        for(y=0; y<m_Height; y++)
            for(x=0; x<m_Width; x++)
            {
                if (ChkPic(x,y)==false)
                {   MAP(y,x,0)= 0;
                    MAP(y,x,1)= 0;
                    MAP(y,x,2)= 0;
                }
            }
    }
    
  3. Main.cpp の AppInit() から OpenFile() で画像ファイルを選択します。
    InitDib() で DibStruct を初期化して下さい。
    Show(ImageAI->Dib.hBmpDC, 0, 0) でロードした画像を Dib.hBmpDC に転送します。
    Delete Color では SetRGB(7) を使っていましたが、より直接的な方法です。
    // 画像をロードして、24bit DIB を作成
    LRESULT  AppInit(HWND hwnd)
    {
        ImageAI= new IMAGEAI(hwnd);
        if (ImageAI->OpenFile()==false) return false;
        ImageAI->InitDib();
        ImageAI->Show(ImageAI->Dib.hBmpDC, 0, 0);
        return true;
    }
    
  4. Main.cpp では、閾値の領域を定義して、マウスのクリックで値をアップします。
    char        ImgFile[]= "c:\\data\\test\\ばなな.bmp";
    WORD        wd= 10;             // 閾値
    
            ・・・
    
            case WM_LBUTTONDOWN:    // 左ボタンをクリック
                wd= wd+2;
                // X,Y の色を抽出
                ImageAI->Sel_Color(200,200,wd);
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  5. 果物の画像はデジカメで撮影したものをサイズを縮小しました。
    Main.cpp の基本ソースコードは Image 3原色 を参照して下さい。
    ImageAI Class のソースコードは Color ⇒ Grayscale を参照して下さい。

[Next Chapter ↓] Color&Size
[Previous Chapter ↑] Delete Color

超初心者のプログラム入門(Win32API C++)