Color&Size

物体の色調とサイズを調べます。

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

画像全体の色調を調べる

  1. Main.cpp の AppInit() から OpenFile() で画像ファイルを選択します。
    InitDib() で DibStruct を初期化して下さい。
    SetRGB(7) で画像の色を本来の色に設定します。
    // 画像をロードして、24bit DIB を作成
    LRESULT  AppInit(HWND hwnd)
    {
        ImageAI= new IMAGEAI(hwnd);
        if (ImageAI->OpenFile()==false) return false;
        ImageAI->InitDib();
        ImageAI->SetRGB(7);
        return true;
    }
    
  2. WM_LBUTTONDOWN: では、Del_Color() で背景色を削除して Sum_Color() で画像全体の色調を調べます。
    閾値は 100 にするのが良いようです。
            case WM_LBUTTONDOWN:    // 左ボタンをクリック
                ImageAI->Del_Color(0,0,100);
                ImageAI->Sum_Color();
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  3. WM_PAINT では Del_Color() で背景色を削除した画像を描画します。
            case WM_PAINT:          // Dib の画像を描画
                hdc = BeginPaint(hWnd,&ps);
                if (ImageAI)   ImageAI->ShowDib(hdc,30,20);
                EndPaint(hWnd, &ps);
                break;
    
  4. ImageAI Class の説明です。
    画像全体の色調(RGB の使用率)を格納する領域です。
        int     rgb[3];         //RGB Color(%)
    
  5. 画像全体の色調(RGB の使用率)を計算する Sum_Color() 関数です。
    Debug() で rgb[3] を印字しています。
    // Dib 画像の RGB の使用率を求める(画像全体の色調)
    void  IMAGEAI::Sum_Color()
    {   int     x, y, cp;
        int     sum[3],wk;
    
        sum[0]=sum[1]=sum[2]= 0;
        for(y=0; y<m_Height; y++)
            for(x=0; x<m_Width; x++)
                for (cp=0; cp<3; cp++)
                {   sum[cp] += MAP(y,x,cp);  }
        wk= sum[0]+sum[1]+sum[2];
        for(cp=0; cp<3; cp++)
        {   rgb[cp] = sum[cp]*100/wk;  }
    Debug(rgb);
    }
    

物体の幅と高さ

  1. 物体の幅と高さを調べることにより、おおよその形状やサイズを知る手掛かりになります。
    物体が斜めに置かれていないことが前提で、上下左右から検出される座標を調べます。
    WM_LBUTTONDOWN: では、Del_Color() で背景色を削除して Get_Size() で物体の幅と高さを調べます。
    閾値は 100 にするのが良いようです。
            case WM_LBUTTONDOWN:    // 左ボタンをクリック
                ImageAI->Del_Color(0,0,100);
                ImageAI->Get_Size();
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  2. 物体の幅と高さを格納する領域です。
        int         width, height;      //物体の幅と高さ
    
  3. 上下左右から物体が現れる座標を調べる Get_Size() 関数です。
    Debug("Width",width); Debug("Height",height); で幅と高さを印字しています。
    // Dib 画像の幅と高さを求める
    void  IMAGEAI::Get_Size()
    {   int     x, y, s, e;
        bool    sw;
    
        sw= true;
        for(y=0; y<m_Height && sw; y++)
            for(x=0; x<m_Width && sw; x++)
            {   if (MAP(y,x,0)!=0 || MAP(y,x,1)!=0 || MAP(y,x,2)!=0)
                {   s= y;
                    sw= false;
                }
            }
        sw= true;
        for(y=m_Height-1; y>=0 && sw; y--)
            for(x=0; x<m_Width && sw; x++)
            {   if (MAP(y,x,0)!=0 || MAP(y,x,1)!=0 || MAP(y,x,2)!=0)
                {   e= y;
                    sw= false;
                }
            }
        height= e-s;
        sw= true;
        for(x=0; x<m_Width && sw; x++)
            for(y=0; y<m_Height && sw; y++)
            {   if (MAP(y,x,0)!=0 || MAP(y,x,1)!=0 || MAP(y,x,2)!=0)
                {   s= x;
                    sw= false;
                }
            }
        sw= true;
        for(x=m_Width-1; x>=0 && sw; x--)
            for(y=0; y<m_Height && sw; y++)
            {   if (MAP(y,x,0)!=0 || MAP(y,x,1)!=0 || MAP(y,x,2)!=0)
                {   e= x;
                    sw= false;
                }
            }
        width= e-s;
    Debug("Width",width);
    Debug("Height",height);
    }
    

[Next Chapter ↓] エッジ検出
[Previous Chapter ↑] Select Color

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