画像処理プログラム②トーンカーブ加工(2値化)

今日は2値化によるトーンカーブ加工をやっていきます。

画像1

これに2値化のプログラムで加工します。

わかりやすく説明すると、画素値が0から127の濃い色は黒(0)に、128から255の明るい色は白(255)にするプログラムです。

#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); //画像ファイルのクローズ


/*  画像を白か黒かの2値化して表示する */
   
for (j = 0; j < SIZE; j++) {
      for (i = 0; i < SIZE; i++) 
      {
        img2[i][j] = img[i][j];

	if (img2[i][j] < 127)

       {
             img2[i][j] = 0;
        }
        else
       {
             img2[i][j] = 255;
        }
               

        printf("%d ", img2[i][j]);

      }
   }


fp = fopen("poppo2.raw", "wb"); //画像出力ファイルのオープン
fwrite(img2, 1, SIZE*SIZE, fp); //画像データの書き込み
fclose(fp); //画像ファイルのクローズ
return 0;
}

このプログラムで出力すると次の画像が抽出できる。

画像2

よって2値化に成功した。

次に前回扱った平均化フィルタの7×7バージョンをやっていく。

#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); //画像ファイルのクローズ


/*  7×7のマトリックスの平均値を算出する */

for(i=3; i< SIZE-3; i++){					
    for(j=3; j< SIZE-3; j++){
      img2[i][j] = (img[i][j-2]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i][j+2]+img[i][j+3]+img[i][j-3]
	+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-2][j+3]+img[i-2][j-3]
	+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-1][j+3]+img[i-1][j-3]
	+img[i-3][j-2]+img[i-3][j-1]+img[i-3][j]+img[i-3][j+1]+img[i-3][j+2]+img[i-3][j+3]+img[i-3][j-3]
	+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+1][j+3]+img[i+1][j-3]
	+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+2][j+3]+img[i+2][j-3]
	+img[i+3][j-2]+img[i+3][j-1]+img[i+3][j]+img[i+3][j+1]+img[i+3][j+2]+img[i+3][j+3]+img[i+3][j-3])/49;

	printf("%d ", img2[i][j]);
    }
  }

このプログラムから出力します。

画像3

前回の3×3や5×5よりもかなり強いぼかしになりました。

今日はここまでにします。次回は画像処理とは違うプログラムを組んでみたいと思います。


この記事が気に入ったらサポートをしてみませんか?