画像処理プログラム①平均化フィルタ
今日は画像処理のプログラムで平均化フィルタを作成していきたいと思います。
簡単に言うと画像にぼかしを入れるときに使うプログラムです。
ひよこの画像ファイル「poppo.jpg」に平均化フィルタのプログラムでぼかしをかけていきたいと思います。
#include <stdio.h>
#include <math.h>
#define SIZE 256
int main(void){
int i, j;
double ave;
unsigned char img[SIZE][SIZE]; //入力画像を保持するための配列
unsigned char img2[SIZE][SIZE]; //出力画像を保持するための配列
FILE *fp;
fp = fopen("poppo.raw", "rb"); //入力画像ファイルのオープン
fread(img, 1, SIZE*SIZE, fp); //画像データの読み込み
fclose(fp); //画像ファイルのクローズ
/* 3×3のマトリックスの平均値を算出する */
for(i=2; i< SIZE-2; i++){
for(j=2; j< SIZE-2; j++){
img2[i][j] = (img[i-1][j-1]+img[i-1][j] +img[i-1][j+1]
+img[i][j-1]+img[i][j]+img[i][j+1]
+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
printf("%d ", img2[i][j]);
}
}
fp = fopen("poppo2.raw", "wb"); //画像出力ファイルのオープン
fwrite(img2, 1, SIZE*SIZE, fp); //画像データの書き込み
fclose(fp); //画像ファイルのクローズ
return 0;
}
まずは3×3の平均化フィルタです。結果を出力します。
最初の画像よりもぼやけが入っているのが分かるかと思います。
次は5×5の平均化フィルタを作成していきたいと思います。
#include <stdio.h>
#include <math.h>
#define SIZE 256
int main(void){
int i, j;
double ave;
unsigned char img[SIZE][SIZE]; //入力画像を保持するための配列
unsigned char img2[SIZE][SIZE]; //出力画像を保持するための配列
FILE *fp;
fp = fopen("poppo.raw", "rb"); //入力画像ファイルのオープン
fread(img, 1, SIZE*SIZE, fp); //画像データの読み込み
fclose(fp); //画像ファイルのクローズ
/* 5×5のマトリックスの平均値を算出する */
for(i=2; i< SIZE-2; i++){
for(j=2; j< SIZE-2; j++){
img2[i][j] = (img[i-2][j-2]+img[i-2][j-1]+img[i-2][j]+img[i-2][j+1]+img[i-2][j+2]
+img[i-1][j-2]+img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i-1][j+2]
+img[i][j-2]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i][j+2]
+img[i+1][j-2]+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1]+img[i+1][j+2]
+img[i+2][j-2]+img[i+2][j-1]+img[i+2][j]+img[i+2][j+1]+img[i+2][j+2])/25;
printf("%d ", img2[i][j]);
}
}
fp = fopen("poppo2.raw", "wb"); //画像出力ファイルのオープン
fwrite(img2, 1, SIZE*SIZE, fp); //画像データの書き込み
fclose(fp); //画像ファイルのクローズ
return 0;
}
このフィルタをかけた出力結果を出力します。
先ほどの3×3の画像よりもさらにぼかしが強くなり、最初の画像よりと比較するとわかりやすいと思います。
今日はここまでにしたいと思います。
次回は2値化トーンカーブ加工と7×7の平均化フィルタをやっていきたいと思います。
この記事が気に入ったらサポートをしてみませんか?