study

画像処理 しきい値処理とは?

今回はしきい値処理についてお話したいと思います。しきい値処理とはある値を区切りに白と黒の2bitで表現するために用いられる方法です。普通、グレースケール画像の場合0~255の計256bitで表現されます。しかし、しきい値処理を用いることで、白と黒の2色つまり1bitで表現することができます。

しきい値をどの値に設定するか?

例えば、256×256のグレースケール画像があるとしよう。この画像は全体的に暗めのである。グレースケール画像は0~255bitで表現されるのでしきい値を真ん中である127に設定したとしよう。そうすると、ほとんどの部分が黒色になってしまう。そうならないためにも、しきい値をどの値にするのかが重要である。
一番いい方法としては、入力画像を読み取って分散や平均を調べてしきい値を自動で設定してくれるのが良い。

現在、しきい値を入力画像から自動設定するソースコードを作成中

下記にしきい値処理のソースコードを示す。今回は自分でしきい値を設定するようになっている。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define IMAGESIZE 256
#define MAXGRAY 255
#define MINGRAY 0
void zero_image(float image[IMAGESIZE][IMAGESIZE])
{
  int m,n;
  for(m = 0; m < IMAGESIZE; m++)
  for(n = 0; n < IMAGESIZE; n++)
  image[m][n] = 0.0;
}
int get_image_stdin(float image[IMAGESIZE][IMAGESIZE])
{
  int m,n,pixel;
  for(m = 0; m < IMAGESIZE; m++)
  for(n = 0; n < IMAGESIZE; n++)
  {
    pixel = fgetc(stdin);
    if (pixel == EOF)
    {
      fprintf(stderr,"Find out EOF at the pixel(%d,%d).\n",m,n);
      return(EXIT_FAILURE);
    }
    if (pixel > MAXGRAY)
    pixel = MAXGRAY;
    else if (pixel < MINGRAY)
    pixel = MINGRAY;
    image[m][n] = (float)pixel;
  }
  return(EXIT_SUCCESS);
}
int put_image_stdout(float image[IMAGESIZE][IMAGESIZE])
{
  int m,n,pixel,result;
  for(m = 0; m < IMAGESIZE; m++)
  for(n = 0; n < IMAGESIZE; n++)
  {
    pixel = (int)(image[m][n] + 0.5);
    if (pixel > MAXGRAY)
    pixel = MAXGRAY;
    else if (pixel < MINGRAY)
    pixel = MINGRAY;
    result = fputc(pixel, stdout);
    if (result == EOF)
    {
      fprintf(stderr,"Can’t write image data at the pixel(%d,%d).\n",m,n);
      return(EXIT_FAILURE);
    }
  }
  return(EXIT_SUCCESS);
}
float limit_pixel(float pixel)
{
  float level;
  if (pixel > (float)MAXGRAY)
  level = (float)MAXGRAY;
  else if (pixel < (float)MINGRAY)
  level = (float)MINGRAY;
  else
  level = pixel;
  return(level);
}
void reverse_image(float image[IMAGESIZE][IMAGESIZE])
{
  int m, n;
  for(m = 0; m < IMAGESIZE; m++)
  for(n = 0; n < IMAGESIZE; n++)
  {
    image[m][n] = limit_pixel(image[m][n]);
    image[m][n] = (float)MAXGRAY - image[m][n];
  }
}
int main()
{
  int m, n;
  float dx, dy;
  float image[IMAGESIZE][IMAGESIZE], edge[IMAGESIZE][IMAGESIZE];
  get_image_stdin(image);
  for(m = 1; m < IMAGESIZE-1; m++)
  for(n = 1; n < IMAGESIZE-1; n++)
  {

    if(image[m][n]<128)
      {
        edge[m][n]=0;
      }
      else{
        edge[m][n]=255;
      }
   
  }

  
  put_image_stdout(edge);
}

ソースコードを見ても分かるように数字の128を変えてやると自分でしきい値を設定することができる。
このソースコードは256×256の白黒画像で実行することができます。画像のサイズを変えたいときは#define IMAGESIZE 256を変えてください。また正方形の画像でないときはIMAGESIZEを縦と横の二つを定義させる必要があります。

コンパイルの方法はgcc median.c -lm

実行方法は./a.out <入力する画像ファイル名.拡張子> 出力する画像ファイル名.拡張子

入力画像

出力画像