画像処理


  1. 目的
    画像を読み込み、画素単位の処理をして表示する例を紹介します。
  2. 手法
    1. 画像の読み込みと表示
      画像ファイルは
       Image image;
       image = getImage(getDocumentBase(), "ccad.gif");
      で読み込み、paint(Graphics g)で
      g.drawImage(image, 0, 0, this);
      で表示できます。

    2. 画像のサイズ
      画像のサイズは、次のように取得できます。ただし、読み込みが完了していないと、正しい値を取得できません。
       int iwidth=image.getWidth(this);
       int iheight=image.getHeight(this);
      表示サイズは、drawImage()で指定できます。次は半分の大きさで表示します。
       g.drawImage(image, 0, 0, iwidth/2,iheight/2,this);

    3. 画素単位の処理
      imageから画素単位の配列にデータを取り込むにはPixelGrabber()を利用します。

       int pixels[] = new int[iwidth * iheight];
       PixelGrabber pg = new PixelGrabber(image, 0, 0, iwidth, iheight,pixels, 0,  iwidth);
       try { pg.grabPixels(); }
       catch (InterruptedException ev) {}

      pixels[]配列には、下位バイトから、赤、緑、青、の順に記録されます。各色は次のように取り出すことができます。0xは16進数値で、&はビットごとのAND演算です。0xFFは16進の定数で、下位の1バイトのみを取り出し、他のバイトはすべて0にクリアします。
       pixels[y * iwidth + x] & 0xFF;赤
       (pixels[y *iwidth + x] & 0xFF00) /0x100) % 0x100;緑
       (pixels[y * iwidth + x] &0xFF0000) / 0x10000) % 0x100;青
      で(x,y)画素の色成分を取り出すことができます。

    4. 画素配列から、imageクラスへ変換
      pixels[]配列を次のようにimageクラスのオブジェクトに変換できます。
      image = createImage(new MemoryImageSource(iwidth, iheight, pixels, 0 ,iwidth));

    5. エンボス加工(浮き出し)
      隣接する画像の色成分の差をとることで、色の変化を知ることができますが、差をとると負の値になる場合がありますから、半分の128を加えます。これで、明るい色から暗い色に変化しますと、正の差の値+128ですから、明るい色になります。逆に、暗い色から明るい色になると、負の値+128ですから、暗い色になります。したがって、変化する境界で明るい点または暗い点を計算できます。これで、擬似的な浮き上がりの表示を行います。
       ただし、この操作のみでは、負の値や255以上の値が計算されますから、計算後0から255の範囲に押し込みます。

  3. プログラム
    1. レイアウト
      画像を読み込むLoadボタン、画像を半サイズで表示する1/2ボタン、画像の変化する境界を取り出すエッジ処理のボタンを用意します。


    2. メソッド
      1. Load_actionPerformed(ActionEvent e)
        loadボタンで起動されます。指定する画像を読み込みます。境界が明確な画像を読み込むと効果が理解しやすくなります。画像ファイルはclassesフォルダに保存します。

      2. half_actionPerformed(ActionEvent e)
        1/2ボタンで実行されます。halfFlgをtrueにします。

      3. edge_actionPerformed(ActionEvent e)
        edgeボタンで起動されます。pixels[]に色情報を取り出し、差分処理を行います。ここでは、斜め方向の変化を検出するため右下の画素との差分を取ります。
        各色成分ごとに計算し、結果の平均ををGRB同じ値でpixels[]に記録します。したがって、結果の色は灰色になります。normal()で結果を0..255の範囲に押し込みます。
        赤色成分の処理は以下のようになります。pixels[y * iwidth + x]  はy行x列の画素になります。
          int red = ((pixels[(y + 1) * iwidth + x + 1] & 0xFF)- (pixels[y * iwidth + x] & 0xFF)) + 128;
        この演算をすべての画素に行います。ただし、左右と上下の両端の画素は比較対象がありませんから、処理できません。
      4. normal(int col)
        色の値を0以上255以下に制限します。

      5. paint(Graphics g)
        imageの画像を表示します。ただし、halfFlgがonの場合半分のサイズで表示します。

  4. 実行
    loadボタンで、画像を取り込みます。ここでは、画像ファイルを ccad.gif としています。他のファイルを利用する場合は、load_actionPerformed() のファイル名を変更します。embosssボタンはエンボス(浮き上がり)処理を行います。1/2は画像のサイズを半分にします。



  5. ダウンロード
    このプロジェクトをダウンロードできます。次の行をクリックして、emboss.exeファイルを適当なフォルダに保存します。
    ダウンロード開始(Jbuiderプロジェクト)
    ダウンロード(ソース)
    このファイルは自己解凍型の圧縮ファイルです。このファイルを実行すると指定したフォルダに必要なファイルが生成されます。

トップに戻る