チーム19C3

課題名

アベレージフィルタ

研究者名

Koki Yoshimi
Akihiro Nakamura

概要

19A3を参考にして、アベレージフィルタの実装を行った。
kernelによって平均化する値を変える作業を行った。

まず平均化するカーネルサイズの大きさを0から3の値の中で決定する


kernelが0のときは、カーネルサイズが3×3。
kernelが1のときは、カーネルサイズが7×7。
kernelが2のときは、カーネルサイズが15×15。
kernelが3のときは、カーネルサイズが30×30とした。



この時平均化フィルタを適用したくないときは0~3以外の値を入れると実行されないようなプログラミングをした。



その次にmodeによって画像自体のrgb値から様々な変化をつけるようにした。


modeに1を入れた時,白黒になるようにした。


modeに2を入れた時,画像が明るくなるようにした。


modeに3を入れた時,画像が暗くなるようにした。



つまり,このプログラムの全容は任意の粗さの平均化フィルタを通した画像に対してrgb値を変えることで
平均化フィルタと画像の変化を同時に行えるようにしたものである。




ソース

見出し2に対する内容や説明文などを書いてください。

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


int main(const int argc, const char *argv[]){


FILE *out, *in;
 gdImagePtr im, im_new;
 int width, height, i, j, color, r, g, b, pixel, l, k, y, c, step , kernel, gray1,mode;
 int lpix, lgray, rpix, rgray;
 int upix, ugray, dpix, dgray, lap;

printf("カーネル:");
 scanf("%d", &kernel);
 if(kernel == 0)
   step = 3;
else if(kernel == 1)
   step = 7;
else if(kernel == 2)
  step = 15;
else if(kernel == 3)
  step = 30;
 else
   step = 1;
printf("モード:");
scanf("%d",&mode);

int R[8], G[8], B[8];
 if(argv[1] == NULL | | argv[2] == NULL | | !strcmp(argv[1], argv[2])){
   printf("argument error\n");
   exit(-1);
 }

if((in = fopen(argv[1], "r")) == NULL){
   printf("file open error for %s\n", argv[1]);
   exit(-1);
 }
 if((out = fopen(argv[2], "wb")) == NULL){
   printf("file open error for %s\n", argv[2]);
   exit(-1);
 }

im = gdImageCreateFromJpeg(in);

width = gdImageSX(im);
 height = gdImageSY(im);

im_new = gdImageCreateTrueColor(width, height);

for(i=1; i<(width-step); i=i+step){
   for(j=1; j<(height-step); j=j+step){

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

  }
     }

    r = r/step/step;
     g = g/step/step;
     b = b/step/step;

    if (r < 0)  r = 0;
     if (g < 0)  g = 0;
     if (b < 0)  b = 0;
     if (255 < r)  r = 255;
     if (255 < g)  g = 255;
     if (255 < b)  b = 255;



    //白黒
     if(mode == 1){
   gray1 = (77*r + 151*g + 28*b) / 256;
   r = gray1;
   g = gray1;
   b = gray1;
     }

    //画像を明るくする
     if(mode== 2){
   if(r < 127)
     r = r*2;
   else
     r = 255;
   if(g < 127)
     g = g*2;
   else
     g = 255;
   if(b < 127)
     b = b*2;
   else
     b = 255;
     }
     //画像を暗くする
     if(mode == 3){
   if(r > 127)
     r = r/2;
   else
     r = 0;
   if(g >127)
     g = g/2;
   else
     g = 0;
   if(b > 127)
     b = b/2;
   else
     b = 0;
     }
   //ネガ
   if(mode == 4){
     r = 255-r;
     g = 255-g;
     b = 255-b;
   }


    //  各画素を求めた色で表示する。表示範囲を超えないようにサイズの確認をする。
     for (k = 0; k < step; k++) {
   for (l = 0; l < step; l++) {
     if (j + k < height) {
       if (i + l < width) {
         //im の (i,j) における r,g,b の値を取得
         color=gdImageColorExact(im_new,r,g,b);
         //im_new の (i,j) におけるピクセル値を color で設定

        gdImageSetPixel(im_new,i+k,j+l,color);
       }
     }

  }
     }


  }
 }

gdImageJpeg(im_new,out,-1);

fclose(in);
 fclose(out);

return 0;
}

画像

以下にいくつかサンプル画像を貼っておく。


元画像

Desert.jpg




kernelが1,modeが3の場合

out13.jpg





kernelが1,modeが4の場合

out14.jpg





kernelが0,modeが1の場合

out01.jpg





kernelが2,modeが2の場合

out22.jpg




考察

画像の平均化と、画像の彩度の編集を同時に実装することが出来た。
カーネルサイズを上げると、画像のモザイクが粗くなった。

  • 最終更新:2019-07-15 16:51:48

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

認証パスワード