チーム19F1

課題名

モザイク処理とFFT

研究者名

Yui Suzuki
Liu XiaoXuan

使用言語

C言語、Java

概要

画像のモザイク処理と、その変換前後の画像をFFTで周波数成分へ変換した画像を作成した。


モザイク処理

チーム15B3のソースコードを改良して画像の端までモザイク処理がされるようにする.

ある画像をstep*stepのブロックごとにアベレージ・フィルターをかけるとRGBの値の平均値によってモザイクをかけることができるが,
チーム15B3は端の大きさが足らない部分を無視し,黒のままにしていた.

元の画像
lena.jpeg

15B3の画像
out1.jpeg

私たちは,アベレージ・フィルターでRGBの値で平均値をとるとき,step*stepのブロックの大きさが取れない端で,余りの部分を考えて割り算することで,正しくアベレージ・フィルターがかけられるようにした.

私達の画像
out8.jpeg


FFT

チーム15C2が作成したFFTのプログラムを引用して、
元の画像と元画像に私たちがモザイク処理した画像の2つをFFTで変換した。

元の画像を変換したもの
freq_lena.jpg

私たちの画像を変換したもの
freq_lena_moz.jpg

ここで、この画像は
中央に行くほど高周波、端に行くほど低周波の成分を表し、
青いほどその成分が少なく、赤いほど多いことを表している。


ソースコード

このソースコードはチーム15B3のプログラムを参考にして作成した、入力画像をモザイク処理するものである。

#include <gd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define step 20


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,wid,hei;

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=0;i<width;i=i+step){
  for(j=0;j<height;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);
        }
     }
     // step*stepの大きさが取れない部分でも,そのブロックの大きさで割るようにする.
     wid=step;
     hei=step;
     if(i+step >width)
        wid = width % step;
     if(j+step >height)
        hei = height % step;
     r=r/wid/hei;
     g=g/wid/hei;
     b=b/wid/hei;
     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;
     
     //  各画素を求めた色で表示する。表示範囲を超えないようにサイズの確認をする。
     for (k = 0; k < step; k++) { 
        for (l = 0; l < step; l++) { 
           //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;
}


画像をFFTで変換するソースコードは、チーム15C2のものを引用した。



考察

モザイク処理をするためにアベレージ・フィルターを使用した。このとき、平均値をとる際に割り算をするとき、画像の端の部分ではstep*stepで割ると、暗くなってしまった。これは、ブロック内のピクセルの情報がstep*stepより少ないにもかかわらず、step*stepで割っているからだと考えた。そこで、暗くなった部分ではピクセルの情報がある部分だけの大きさで割るように工夫した。
また、モザイク処理した画像をFFTで変換した画像を見ると、格子状の模様が現れていた。この格子のマス目を見るとどれも似たような形をしていて周期的に変化していることがわかる。さらに、FFTで変換した画像を見比べると、元の画像よりモザイク処理をした画像のほうが、中央のほうに青色の部分が多くなっているので、高周波成分がなくなっている。よって、モザイク処理はローパスフィルタの1つであると考えた。

  • 最終更新:2019-12-23 15:59:30

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

認証パスワード