Color ⇒ Binary Mode

カラー画像を二値画像に変換します。

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

カラー ⇒ 二値画像

  1. カラー画像は RGB を8ビットずつ(1ピクセル=24ビット)で記録されています。
    青色(B)の8ビット 緑色(G)の8ビット 赤色(R)の8ビット
    これを二値画像に変換します。
    二値画像は、グレースケールやこの後で説明するマスク画像と合わせて画像の解析に役に立ちそうです。
  2. 二値画像に変換する BinMode() 関数です。
    hBmpDC に転送された画像をピクセル毎に判定して、白黒二値の画像に変換します。
    RGB を単純に加える方法では、色に対する明るさが考慮されていません。
    そこでウエイトを掛けて判定しています。
    val は二値画像の閾値(しきいち)で値が大きくなるほど、黒のピクセルが増えます。
    // Image 画像を Dib.hBmp に転送して Binary Mode に変換する
    void  IMAGEAI::BinMode(WORD val)
    {   int     x, y;
        WORD    wk;
    
        Show(Dib.hBmpDC, 0, 0);
    VarMsg(hWnd,"WORD VAL:",val);
        for(y=0; y<m_Height; y++)
            for(x=0; x<m_Width; x++)
            {
                wk= (MAP(y,x,2)*2 + MAP(y,x,1)*4 + MAP(y,x,0)) / 7;
                if (wk<val)
                {   MAP(y,x,0)= 0;
                    MAP(y,x,1)= 0;
                    MAP(y,x,2)= 0;
                }
                else
                {   MAP(y,x,0)= 255;
                    MAP(y,x,1)= 255;
                    MAP(y,x,2)= 255;
                }
            }
    }
    
  3. Main.cpp の AppInit() から OpenFile() で画像ファイルを選択します。
    InitDib() で DibStruct を初期化して下さい。
    WM_PAINT では Dib.hBmpDC の画像を描画するので入力した画像を転送しています。
    // 画像をロードして、24bit DIB を作成
    LRESULT  AppInit(HWND hwnd)
    {
        ImageAI= new IMAGEAI(hwnd);
        if (ImageAI->OpenFile()==false) return false;
        ImageAI->Adjust(false);
        ImageAI->InitDib();
        ImageAI->Show(ImageAI->Dib.hBmpDC, 0, 0);
        return true;
    }
    
  4. WM_PAINT では ShowDib() で Dib.hBmpDC の画像を描画します。
            case WM_PAINT:          // Grayscale を描画
                hdc = BeginPaint(hWnd,&ps);
                if (ImageAI)
                {   ImageAI->ShowDib(hdc, 0, 0);    }
                EndPaint(hWnd, &ps);
                break;
    
  5. WM_LBUTTONDOWN では、wd をアップしながらカラー画像を二値画像に変換します。
    WORD        wd= 50;             // 閾値(幅)
    
            case WM_LBUTTONDOWN:    // 左ボタンをクリック
                wd= wd+2;
                // Binay Mode に変換
                ImageAI->BinMode(wd);
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  6. WM_RBUTTONDOWN では、wd を最初の値に戻します。
            case WM_RBUTTONDOWN:    // 右ボタンをクリック
                wd= 50;
                ImageAI->Show(ImageAI->Dib.hBmpDC, 0, 0);
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  7. C#でも同様のプログラムを作成しています。
    Color ⇒ 二値画像 を参照して下さい。

[Next Chapter ↓] Delete Color
[Previous Chapter ↑] Color ⇒ Grayscale

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