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

黑白图象中黑点数


在二值图象处理应用程序的设计中,常常需要统计图象中每一行的黑象素数。对于一幅宽为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;
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值