哎,这段时间完成成了送代码的,给你,希望对你有帮助,可以去找原书看一看/*************************************************************************
 *
 * 函数名称:
 *
 *   ThresholdIncise()
 *
 * 参数:
 *
 *   LPSTR lpDIB    //指向源DIB图像指针
 *
 * 返回值:
 *
 *   BOOL           //运算成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *
 * 该函数用迭代阀值算法对256色位图和24位真彩色位图进行阈值分割运算。
 * 
 ************************************************************************/BOOL WINAPI ThresholdIncise(LPSTR lpDIB)
{

// 指向源图像的指针
LPSTR lpSrc;

// 指向缓存图像的指针
LPSTR lpDst; //指向原图像像素的指针
LPSTR   lpDIBBits; //原图像的宽度和高度
LONG    lWidth,lHeight;

// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits; //循环变量
long i;
long j; //像素值
BYTE  pixel; //直方图数组
long lHistogram[256]; //阈值
BYTE iThreshold,iNewThreshold; //最大灰度值与最小灰度值,两个区域的平均灰度值
BYTE iMaxGrayValue,iMinGrayValue,iMeanGrayValue1,iMeanGrayValue2; //用于计算区域灰度平均值的中间变量
long lTemp1,lTemp2,lTemp3,lTemp4; //迭代次数
int iTimes; // 图像每行的字节数
LONG lLineBytes; //计算图像宽度
lWidth=::DIBWidth(lpDIB); //计算图像高度
lHeight=::DIBHeight(lpDIB);    //原图像每行的字节数
lLineBytes=WIDTHBYTES(lWidth*8);

//获取指向原图像的像素的指针
lpDIBBits=::FindDIBBits(lpDIB); // 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight); if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}

// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits); // 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lLineBytes * lHeight); //初始化直方图数组位0
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
} //获得直方图
//初始化最大、最下灰度值
iMaxGrayValue = 0;
iMinGrayValue = 255; //每列
for (i = 0;i < lWidth ;i++)
{
//每行
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

//象素值
pixel = (BYTE)*lpSrc;

//统计各像素点出现的次数
lHistogram[pixel]++; //求最大,最小灰度值
if(iMinGrayValue > pixel)
{
iMinGrayValue = pixel;
}
if(iMaxGrayValue < pixel)
{
iMaxGrayValue = pixel;
}
}
} //迭代求最佳阈值
iNewThreshold = (iMinGrayValue + iMaxGrayValue)/2;
iThreshold = 0;

//最大迭代次数位50次,可以根据自己的需要设定
for(iTimes = 0; iThreshold != iNewThreshold && iTimes < 50;iTimes ++)
{
iThreshold = iNewThreshold;
lTemp1 =0;
lTemp2 =0;
lTemp3 = 1;
lTemp4 = 1; //求第一个区域的灰度加权平均值
for (i = iMinGrayValue;i < iThreshold;i++)
{
lTemp1 += lHistogram[i]*i;
lTemp3 += lHistogram[i];
}
iMeanGrayValue1 = (BYTE)(lTemp1 / lTemp3); //求第二个区域的灰度加权平均值
for (i = iThreshold;i <=iMaxGrayValue;i++)
{
lTemp2 += lHistogram[i]*i;
lTemp4 += lHistogram[i];
}
iMeanGrayValue2 = (BYTE)(lTemp2 / lTemp4); //修改阀值位新求得的阀值
iNewThreshold =  (iMeanGrayValue1 + iMeanGrayValue2)/2;
} //根据阈值将图像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i; pixel = (BYTE)*lpSrc;

if(pixel <= iThreshold)
{
*lpDst = (BYTE)0;
}
else
{
*lpDst = (BYTE)255;
}
}
} // 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight); // 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits); // 返回
return TRUE;
}