黑白图象中黑点数的计算方法

来源:互联网 发布:怎样下载photoshop软件 编辑:程序博客网 时间:2024/05/16 01:01

黑白图象中黑点数


在二值图象处理应用程序的设计中,常常需要统计图象中每一行的黑象素数。对于一幅宽为Width,高为Height的图象,数组Dots用于存放每行的黑象素数。下面的程序中,CalcRowDots计算图像Image中每行黑象素数,ByteDots计算字节k中黑象素数。
void CalcRowDots(int *Dots, unsigned char far *Image, int Width, int Height)
{
 int  RowBytes = Width / 8;
 int RowDots;
 long RowFirstByte;
 int row, col, byte;
 
 RowFirstByte = 0L;
 for (row = 0; row < Height; row++)
  {
  RowDots = 0;
  for (byte = 0; byte < RowBytes; byte++)
   RowDots += ByteDots(*(Image + RowFirstByte + byte));
  Dots[row] = RowDots;
  RowFirstByte += RowBytes;
  }
}

int ByteDots(int k)
{
 int DotsNum = 0;

 while (k != 0)
  {
  if ((k & 1) != 0) DotsNum++;
  k >>= 1;
  }
 return DotNum; 
}
上面的程序效率不高,通过引入一个查看表ByteDots[256]可以大大提高速度。ByteDots用于表示字符0到255中的黑象素数。ByteDots一开始就计算出来,当统计图象中每一行的黑象素数的程序需要ByteDots时,不需计算而可以直接引用。ByteDots计算程序为:
int ByteDots[256];

void GenByteDots()
{
 int j, k;
 int DotNum;

 for (k = 0; k < 256; k++)
  {
  DotsNum = 0;
  j = k;
  while (j != 0)
   {
   if ((j & 1) != 0) DotsNum++;
   j >>= 1;
   }
  ByteDots[j] = DotNum;
  }
}
计算Dots的程序只需将函数调用语句
   RowDots += ByteDots(*(Image + RowFirstByte + byte));
改为
   RowDots += ByteDots[*(Image + RowFirstByte + byte)];
由于
  ByteDots[0]=0
  ByteDots[1]=1
  ByteDots[2k]=ByteDots[k]    1<k<128
  ByteDots[2k+1]=ByteDots[k]+1   1<k<128
由ByteDots的递推关系,一个更高效的计算ByteDots的程序为:
void GenByteDots()
{
 int j, k;

 ByteDots[0] = 0;
 ByteDots[1] = 1;
 j = 2;

 for (k = 1; k < 128; k++)
  {
  ByteDots[j++] = ByteDots[k];
  ByteDots[j++] = ByteDots[k] + 1;
  }
}