チーム15F3

Subject

Mosaic Squad

Researchers

School year Class Number Name
3 15 38 Tomohiro Nakayama
3 15 42 Taiki Higashino

Use language

C言語
C言語での利点(C++との比較) 覚えるべき事項が少ない
対応する処理系(コンパイラ)が多い
ライブラリが豊富
作成したプログラムの移植性が高い
モジュールで切り出してライブラリ化するのが容易
十分に配慮すれば、危険なコードになることを回避出来る
作成部分と必須ライブラリ共にコンパクトな実行コードになる
自動的に行われる隠れた挙動が少ない
プログラム(含ライブラリ)内の挙動を追いやすい

Source Code Of Mosaic Processing

以下に、モザイク処理班で使用しているソースを公開する。
省略している、今回の範囲外であるファイル等の読み込みはここで参照してください。

#include <gd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(const int argc,const char *argv[]){
  // ファイルの読み込み
   // imに画像を読み込み
   // 入力画像のサイズを取得
   // 新しい画像を用意
   // 以上の順番でここまで処理していく、今回は省略する。

  // nはモザイクのピクセルの大きさ
   printf("pixel size\n");
   scanf("%d", &s);

  // 座標1はモザイクの左上の角
   printf("coordinate1\n");
   printf("x1:"); scanf("%d", &x1);
   printf("y1:"); scanf("%d", &y1);

  // 座標1はモザイクの右下の角
   printf("coordinate2\n");
   printf("x2:"); scanf("%d", &x2);
   printf("y2:"); scanf("%d", &y2);

  // 読み込んだ画像を新規画像にコピー
   for(i=0; i<width; i++){
       for(j=0; j<height; j++){
           pixel = gdImageGetPixel(im, i, j);
           r = gdImageRed(im, pixel);
           g = gdImageGreen(im, pixel);
           b = gdImageBlue(im, pixel);
           color = gdImageColorExact(im_new, r, g, b);
           gdImageSetPixel(im_new, i, j, color);
       }
   }

  // モザイク処理
   // 処理範囲は座標1と座標2を結んだ線分を対角線に持つ長方形内部
   for(i=x1; i<x2-s; i=i+s){
       for(j=y1; j<y2-s; j=j+s){
           r=0; g=0; b=0;

          for(k=0; k<s; k++){
               for(l=0; l<s; l++){
               pixel = gdImageGetPixel(im, i+k, j+l);
                   r = r + gdImageRed(im, pixel);
                   g = g + gdImageGreen(im, pixel);
                   b = b + gdImageBlue(im, pixel);
               }
           }

          // アベレージングフィルタ
           r = r / s / s;
           g = g / s / s;
           b = b / s / s;

          // 画素のエラー処理
           if(r < 0) r = 0;
           if(g < 0) g = 0;
           if(b < 0) b = 0;
           if(r > 255) r = 255;
           if(g > 255) g = 255;
           if(b > 255) b = 255;

          // モザイク処理した画素の貼り付け
           for(k=0; k<s; k++){
               for(l=0; l<s; l++){

                  // 画素の座標のエラー処理
                   if(j+k < height){
                       if(i+l < width){
                           color = gdImageColorExact(im_new, r, g, b);
                           gdImageSetPixel(im_new, i+k, j+l, color);
                       }
                   }
               }
           }
       }
   }

  gdImageJpeg(im_new, out, -1);

  fclose(in);
   fclose(out);

  return(0);
}


Images Of The Result That Gave Mosaic Processing

以下にモザイク処理を施した結果の画像達を以下にいくつか貼っていく。
  Before After
有名な女性の写真(モザイクピクセルの大きさ:5) lena_0.jpg lena_00.jpg
某テーマパークの動物(モザイクピクセルの大きさ:10) mouse.jpg mouse_00.jpg
元議員の会見現場(モザイクピクセルの大きさ:20) nnmr.jpg nnmr_00.jpg


Consideration

入力画像のサイズによってモザイクのピクセルのサイズを考慮しなければならない。よって、その画像にあったピクセルの大きさを指定しなければならない。
例:画像に対してモザイクのピクセルのサイズが小さすぎる場合、ほとんど効果がない。
モザイクを消すことも視野にいれていたが、いろいろと危険が伴うということで断念することに至った(無理でした)。

  • 最終更新:2019-07-08 17:53:52

このWIKIを編集するにはパスワード入力が必要です

認証パスワード