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