第11回 濃淡変換

今回はテキスト5-1(132ページ~)のヒストグラムについての実践を行う。画像の明るさ・コントラストを変えたときにヒストグラムがどのように変化するかを調べる。
オンラインで受講でPCにProcessingが入っていない場合は、まず Processing をダウンロードしてインストールしてから以下の課題を行う。

課題 1 (グレースケール化する)

今日の課題では画像にいろいろな変更を加える。それによってヒストグラムがどう変わるかを調べるため、まずは元画像を用意し、そのヒストグラムをつくる。
  1. 適当に画像検索してサンプル用の画像(デジカメで撮った写真のようなもの。漫画やアニメの画像だと元のヒストグラムに偏りがありすぎ、課題2以降の変化がわからない)をダウンロードし、「元.jpg」という名前でデスクトップに保存する。
  2. 注意
    • 元ファイルの形式がJPEG以外の場合 (拡張子がjpgもしくはjpegでない場合) は、単純にファイル名を変更してもJPEG形式にはならない。ペイントなどで開き、形式をJPEGに指定して「元.jpg」とすれば変えられる。
    • 画像をダウンロードするときは、その画像があるサイトまで行って、大きい画像が見える状態にしてからその画像をダウンロードする。Google画像検索などの画面で小さく表示されているものをダウンロードすると、本来より小さい、画質の悪い画像しか手に入らない。

  3. Processingを起動する。
  4. 以下のコードをProcessingのエディタにコピー&ペーストし、「ex11_1」という名前で保存する。
  5. PImage img = loadImage("元.jpg");
    // 横幅が1024になるようにリサイズ
    img.resize(1024, 1024*img.height/img.width);
    int w = img.width;
    int h = img.height;
    
    img.filter(GRAY); // 画像をグレースケール化する
    img.save("data/画像1.jpg"); // 画像を保存する
    
    // ヒストグラム
    int[] graph = new int[256];
    // 明るさ0~255のピクセルの数をそれぞれカウント
    for (int i=0; i<w*h; i++) {
      graph[int(brightness(img.pixels[i]))]++;
    }
    float hmax=0; // グラフの最大値
    for (int i=0; i<256; i++) {
      if (graph[i]>hmax) {
        hmax = graph[i];
      }
    }
    // ヒストグラムの描画
    PGraphics pg = createGraphics(w, h);
    pg.beginDraw();
    pg.fill(0);
    pg.rect(0, 0, w, h);
    pg.fill(255);
    for (int i=0; i<256; i++) {
      pg.rect(i*4, h*(1-graph[i]/hmax), 4, h*graph[i]/hmax);
    }
    pg.endDraw();
    img.pixels=pg.pixels;
    img.save("data/ヒストグラム1.png"); // 画像を保存する
    exit();

  6. 「元.jpg」をProcessingのエディタにドラッグ&ドロップする。
  7. プログラムを実行する。
  8. (一瞬だけ小さい実行ウィンドウが出るが、勝手に閉じる)
    (これは画像を2つ作るプログラムで、実行画面上には何も表示しない)
  9. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、元画像のほかにグレースケール化した画像「画像1.jpg」とそのヒストグラム「ヒストグラム1.png」ができていることがわかる。
    ダブルクリックして開いてみると大きい画像で確認できる。


    エラーが出てこういう画像ができない場合、「プログラムに「元.jpg」を入れていない」「画像名が間違っている」などが原因になっていることが多い。
    特にファイルの拡張子を表示しない設定にしていると画像名の間違いがおこりやすい (見た目上は「元.jpg」で、本当の名前が「元.jpg.jpg」になっているなど)。拡張子を表示させる方法は「Windows 拡張子 表示」などで調べればすぐに見つかる。
    ここで作る提出物
    • 画像1.jpg
    • ヒストグラム1.png

課題 2 (ネガ・ポジ反転)

ネガ・ポジ反転させたときに、画像とヒストグラムにおこる変化を確認する。
  1. Processingのメニューから「ファイル」→「名前をつけて保存」を選び、「ex11_2」という名前で保存する。
  2. コードを以下のように書き換えて実行する。
  3. (変わるのは赤線のところだけ。8行目は追加、9行目、34行目は「1」→「2」の書き換え)


  4. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、画像1.jpgをネガ・ポジ反転した画像「画像2.jpg」とそのヒストグラム「ヒストグラム2.png」ができていることがわかる。
    2つのヒストグラムを見比べると、ちょうど左右反転した形になっているはず。


    ここで作る提出物
    • 画像2.jpg
    • ヒストグラム2.png

課題 3 (ポスタリゼーション)

ポスタリゼーションを行い、画像とヒストグラムにおこる変化を確認する。
  1. Processingのメニューから「ファイル」→「名前をつけて保存」を選び、「ex11_3」という名前で保存する。
  2. コードを以下のように書き換えて実行する。
  3. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、画像1.jpgをポスタリゼーションした画像「画像3.jpg」とそのヒストグラム「ヒストグラム3.png」ができていることがわかる。
    「ヒストグラム3.png」には、4本の縦棒だけが出ている状態になっているはず。


    ここで作る提出物
    • 画像3.jpg
    • ヒストグラム3.png

課題 4 (明るくする)

全体的に明るくし、画像とヒストグラムにおこる変化を確認する。
  1. Processingのメニューから「ファイル」→「名前をつけて保存」を選び、「ex11_4」という名前で保存する。
  2. コードを以下のように書き換えて実行する。
  3. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、画像1.jpgを全体的に明るくした画像「画像4.jpg」とそのヒストグラム「ヒストグラム4.png」ができていることがわかる。
    「ヒストグラム4.png」は、「ヒストグラム1.png」に比べて右にずれた状態になっているはず。


    ここで作る提出物
    • 画像4.jpg
    • ヒストグラム4.png

課題 5 (暗くする)

全体的に暗くし、画像とヒストグラムにおこる変化を確認する。
  1. Processingのメニューから「ファイル」→「名前をつけて保存」を選び、「ex11_5」という名前で保存する。
  2. コードを以下のように書き換えて実行する。
  3. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、画像1.jpgを全体的に暗くした画像「画像5.jpg」とそのヒストグラム「ヒストグラム5.png」ができていることがわかる。
    「ヒストグラム5.png」は、「ヒストグラム1.png」に比べて右にずれた状態になっているはず。


    ここで作る提出物
    • 画像5.jpg
    • ヒストグラム5.png

課題 6 (ソラリゼーション)

ソラリゼーションを行い、画像とヒストグラムにおこる変化を確認する。
  1. Processingのメニューから「ファイル」→「名前をつけて保存」を選び、「ex11_6」という名前で保存する。
  2. コードを以下のように書き換えて実行する。
  3. 上のメニューから「スケッチ」→「スケッチフォルダーを開く」を選び、出てきたウインドウで「data」をダブルクリックする。
    すると、画像1.jpgにソラリゼーションをかけた画像「画像6.jpg」とそのヒストグラム「ヒストグラム6.png」ができていることがわかる。
    元画像の条件がよければ (中間くらいの明るさの部分がまんべんなくあれば) 明暗のグラデーションが反転した部分ができる。


    ここで作る提出物
    • 画像6.jpg
    • ヒストグラム6.png

提出


戻る

inserted by FC2 system