チーム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;
}
画像
以下にいくつかサンプル画像を貼っておく。
元画像
kernelが1,modeが3の場合
kernelが1,modeが4の場合
kernelが0,modeが1の場合
kernelが2,modeが2の場合
考察
画像の平均化と、画像の彩度の編集を同時に実装することが出来た。
カーネルサイズを上げると、画像のモザイクが粗くなった。
- 最終更新:2019-07-15 16:51:48