第12回 収縮・膨張の組み合わせ


今回のプログラムの最終的な機能

はじめに、これから作るプログラムが完成した時点の機能をざっと見ておく。


オープニング・クロージング


課題 1

    ベースのプログラム (このままでは元画像にノイズが加わった画像が表示されるだけ)
    PImage img;          // 元画像
    PImage[] outputImg = new PImage[2]; // 出力・画面表示画像(0:ノイズ、1:処理後)
    int stime;           // カウント開始時刻
    
    void setup() {
      size(400, 300);
      img = loadImage("1元.png");
      img.filter(THRESHOLD); // 二値化する
      // 画面表示用の画像に同じものをコピー
      outputImg[0] = img.get();
      outputImg[1] = img.get();
      // ノイズ追加
      for (int i=0; i<img.pixels.length/100; i++) {
        int r = (int)random(img.pixels.length);
        outputImg[0].pixels[r] = color(255-brightness(img.pixels[r]));
      }
      outputImg[0].save("data/1ノイズ.png");
      outputImg[1]=outputImg[0].get();
      stime = millis();
    }
    
    // 2秒ごとに細線化前・細線化後の画像を交互に表示
    void draw() {
      image(outputImg[1-(millis()-stime)/2000%2], 0, 0, width, height);
    }
    
    void opening(int n) {
      outputImg[1] = outputImg[0].get();
      // outputImg[1]に収縮処理をn回行う
      // outputImg[1]に膨張処理をn回行う
      outputImg[1].save("data/1オープニング.png");
    }
    
    void closing(int n) {
      outputImg[1] = outputImg[0].get();
      // outputImg[1]に膨張処理をn回行う
      // outputImg[1]に収縮処理をn回行う
      outputImg[1].save("data/1クロージング.png");
    }
    
    // 膨張・収縮・収縮・膨張
    void deed(int n) {
      outputImg[1] = outputImg[0].get();
      // outputImg[1]に膨張処理をn回行う
      // outputImg[1]に収縮処理をn*2回行う
      // outputImg[1]に膨張処理をn回行う
      outputImg[1].save("data/2膨収膨.png");
    }
    
    // 収縮・膨張・膨張・収縮
    void edde(int n) {
      outputImg[1] = outputImg[0].get();
      // outputImg[1]に収縮処理をn回行う
      // outputImg[1]に膨張処理をn*2回行う
      // outputImg[1]に収縮処理をn回行う
      outputImg[1].save("data/2収膨収.png");
    }
    
    void topHat(int n) {
      opening(n);
      for (int i=0; i<img.pixels.length; i++) {
        // outputImg[0](ノイズ画像)の i 番目のピクセルの明度をfloat c0に入れる
        // outputImg[1](オープニングした画像)の i 番目のピクセルの明度をfloat c1に入れる
        // c0-c1をoutputImg[1](出力画像)のi番目のピクセルの明度とする
      }
      outputImg[1].updatePixels();
      outputImg[1].save("data/3トップハット.png");
    }
    
    void blackHat(int n) {
      closing(n);
      for (int i=0; i<img.pixels.length; i++) {
        // outputImg[0](ノイズ画像)の i 番目のピクセルの明度をfloat c0に入れる
        // outputImg[1](クロージングした画像)の i 番目のピクセルの明度をfloat c1に入れる
        // c1-c0をoutputImg[1](出力画像)のi番目のピクセルの明度とする
      }
      outputImg[1].updatePixels();
      outputImg[1].save("data/3ブラックハット.png");
    }
    
    void keyPressed() {
      stime = millis();
      int n = 1;
      // オープニング
      if (key=='1') {
        opening(n);
      }
      // クロージング
      if (key=='2') {
        closing(n);
      }
      // 膨張・収縮・収縮・膨張
      if (key=='3') {
        deed(n);
      }
      // 収縮・膨張・膨張・収縮
      if (key=='4') {
        edde(n);
      }
      // トップハット
      if (key=='5') {
        topHat(n);
      }
      // ブラックハット
      if (key=='6') {
        blackHat(n);
      }
      // 1~6キーのすべての処理
      if (key=='7'){
        opening(n);
        closing(n);
        deed(n);
        edde(n);
        topHat(n);
        blackHat(n);
      }
    }
    

  1. Processingのエディタに上のサンプルプログラムのコードをコピー&ペーストする。
  2. 「img12」という名前で保存する。
  3. ペイントを起動して画像サイズを横400、縦300にする。
  4. 文字入力機能(72ポイント、太字、黒)で左半分に収まるように適当な文字を書く。


  5. 書いた文字を範囲選択し、コピーしてそのまま貼り付ける。


  6. 点線の中をつかんでドラッグし、右側に移動させる。


  7. 点線の中で右クリックして「色の反転」を選ぶ。右図のような状態になったら「1元.png」という名前でデスクトップに保存する。


  8. 「1元.png」をProcessingのウインドウにドラッグ&ドロップする。
  9. opening関数の2つのコメント文の下に、それぞれ対応するコードを追加する。

  10. 実行して画面をクリックしてからキーボードの「1」キーを押す。

  11. closing関数の2つのコメント文の下に、それぞれ対応するコードを追加する。

  12. 実行して画面をクリックしてからキーボードの「2」キーを押す。

  13. この時点で存在するファイル (この時点のものは提出物ではないので、提出用バックアップなどはしないこと)
    ※ うまくいかないときは最終的なopening関数、closing関数とコードを見比べる。

白黒両方のノイズを消す処理

課題 2

  1. deed関数 (この関数名は「dilate, erode, erode, dilate」の頭文字) の3つのコメント文の下に、対応するコードを追加する。

  2. 実行して画面をクリックしてからキーボードの「3」キーを押す。

  3. edde関数 (この関数名は「erode, dilate, dilate, erode」の頭文字) の3つのコメント文の下に、対応するコードを追加する。

  4. 実行して画面をクリックしてからキーボードの「4」キーを押す。

  5. この時点で増えるファイル (この時点のものは提出物ではないので、提出用バックアップなどはしないこと)
    ※ うまくいかないときは最終的なdeed関数とedde関数とコードを見比べる。

トップハット・ブラックハット

課題 3

  1. topHat関数の3つのコメント文の下に、対応するコードを追加する。

  2. 実行して画面をクリックしてからキーボードの「5」キーを押す。

  3. blackHat関数の3つのコメント文の下に、対応するコードを追加する。

  4. 実行して画面をクリックしてからキーボードの「6」キーを押す。

  5. キーボードの「7」キーを押す (この時のノイズ画像をベースとした6つの画像が作り直される)。
  6. ここで増える提出物
    ※ うまくいかないときは最終的なtopHat関数とblackHat関数とコードを見比べる。

提出

小テスト予告



戻る inserted by FC2 system