チーム19D4

課題名

画像処理 アベレージフィルタ

研究者名

Daiki Kan

概要

19C3を参考にして、アベレージフィルタの実装を行った。


また、modeを入力してrgb値を変更するところで、ネガの追加。
17A2を参考にして鮮鋭化フィルタの実装を行った。


1.カーネルサイズの大きさを0から3の値の中で決定する。

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

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

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


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


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


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


modeに4を入れた時,ネガになるようにした。


modeに5を入れた時、鮮鋭化。


ソース

見出し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,gray;
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 = 5;
else if(kernel == 2)
step = 15;
else if(kernel == 3)
step = 30;
else if(kernel == 4)
step = 60;
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;
  }

if (mode == 5) {
               pixel = gdImageGetPixel(im, i, j);
              gray = (77*gdImageRed(im, pixel) + 151*gdImageGreen(im, pixel) + 28*gdImageBlue(im, pixel)) / 256;
              r = gray; g = gray; b = gray;

            lpix = gdImageGetPixel(im, i-1, j);
              lgray = (77*gdImageRed(im, lpix) + 151*gdImageGreen(im, lpix) + 28*gdImageBlue(im, lpix)) / 256;
                   
              rpix = gdImageGetPixel(im, i+1, j);
              rgray = (77*gdImageRed(im, rpix) + 151*gdImageGreen(im, rpix) + 28*gdImageBlue(im, rpix)) / 256;

            upix = gdImageGetPixel(im, i, j-1);
              ugray = (77*gdImageRed(im, upix) + 151*gdImageGreen(im, upix) + 28*gdImageBlue(im, upix)) / 256;

            dpix = gdImageGetPixel(im, i, j+1);
              dgray = (77*gdImageRed(im, dpix) + 151*gdImageGreen(im, dpix) + 28*gdImageBlue(im, dpix)) / 256;

            lap = 1*lgray + 1*rgray + 1*ugray + 1*dgray - 4*gray;
              r = r-lap; g = g-lap; b = b-lap;
          }


  //  各画素を求めた色で表示する。表示範囲を超えないようにサイズの確認をする。
    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;
}

画像

元画像
sea.jpg


kernel1 mode1 白黒
0101.jpg



kernel2 mode2 明るくする
0202.jpg



kernel3 mode3 暗くする
0303.jpg



kernel1 mode4 ネガ
0104.jpg



kernel6 mode5 鮮鋭化
0605.jpg



考察

考察内容を書いてください。
カーネルサイズが低いとより元画像に近く、カーネルサイズが高いとより画像が粗くなる。
鮮鋭化に関しては、ラプラシアンフィルタを利用してエッジを割り出して、元の画像との差分を取ることで鮮鋭化をさせるということは理解したが、まだ理解が不十分なのでもう少し読み込みたい。

最初の段階でコンパイルが通らず苦労した。
gd.hライブラリが参照されておらず
gcc ~.c -ldgでコンパイルを行ったら、うまくいった。

  • 最終更新:2019-10-21 16:54:11

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

認証パスワード