* 函数名称:
* GrayStrech()
*
* 参数:
* LPSTR lpDIBBits -指向原DIB图像的指针
* LONG lWidth -原图像的宽度(像素)
* LONG lHeight -原图像的高度(像素)
* BYTE bX1 -灰度拉伸第一个点的X坐标
* BYTE bY1 -灰度拉伸第一个点的Y坐标
* BYTE bX2 -灰度拉伸第二个点的X坐标
* BYTE bY2 -灰度拉伸第二个点的Y坐标
*
* 返回值:
* BOOL -成功则返回TRUE,否则返回FALSE
*
* 说明:
* 该函数用来对图像进行灰度拉伸,改善输出图像
*
*************************************************************************/
BOOL WINAPI GrayStrech(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,BYTE bX1,
BYTE bY1,BYTE bX2,BYTE bY2)
{
unsigned char *lpSrc; //指向原图像的指针
LONG i,j; //循环变量
BYTE bMap[256]; //灰度映射表
LONG lLineBytes; //图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8); //计算图像每行的字节数
//计算灰度映射表
for (i = 0;i <= bX1;i++){
//判断bX1是否大于0(防止分母为0)
if (bX1 > 0) {
//线性变换
bMap[i] = (BYTE) bY1*i/bX1;
}
else {
//直接置0
bMap[i] = 0;
}
}
for (;i <= bX2;i++){
//判断bX1是否等于bX2(防止分母为0)
if (bX2 != bX1) {
//线性变换
bMap[i] = bY1 + (BYTE)((bY2 - bY1)*(i - bX1)/(bX2 - bX1));
}
else {
//直接置为bY1
bMap[1] = bY1;
}
}
for (;i < 256;i++) {
//判断bX2是否等于255(防止分母为0)
if (bX2 != 255){
//线性变换
bMap[i] = bY2 + (BYTE)((255 - bY2)*(i - bX2)/(255 - bX2));
}
else {
//直接置为255
bMap[i] = 255;
}
}
//每行
for (i = 0;i < lHeight;i++){
//每列
for (j = 0;j < lWidth;j++) {
//指向DIB第i行第j个像素 指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes*(lHeight - 1 - i) + j;
//计算新的灰度值
*lpSrc = bMap[*lpSrc];
}
}
return TRUE;
}
图像灰度拉伸
最新推荐文章于 2023-04-17 17:26:27 发布