其他分享
首页 > 其他分享> > 3 - 图片灰度化与转换为八位灰度图片

3 - 图片灰度化与转换为八位灰度图片

作者:互联网

参考资料:彩色图像灰度化

图片灰度化与转换为八位灰度图片

1、灰度化公式

2、24 位真彩图灰度化

/************************************************************
*Function:		Bmp24_2_GrayBmp24
*Description:	24 位真彩图图片灰度化
*Params:		imgData - 位图数据
*				width - 图像宽度
*				height - 图像高度
*				mode - 灰度化方式,枚举类型
*Return:		None
************************************************************/
void Bmp24_2_GrayBmp24(uint8_t* imgData, uint32_t width, uint32_t height, int mode)
{
	// 计算真实的行字节
    uint32_t realWidth = WidthBytes(width * 24);													
	
    // 循环处理像素数据
    for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < width; j++) {
			// 定义 gray 灰度值,以及计算真实位图数据位置偏移量,对应于图像的各像素点RGB的起点  
            uint8_t gray = 0;	
            uint32_t point = i * realWidth + j * 3;	            										
            // 模式选择
            switch (mode)           
            {
            case 1:
                gray = (imgData[point] + imgData[point + 1] + imgData[point + 2]) / 3;   // 平均计算
                break;            
            default:
                gray = (imgData[point] * 114 + imgData[point + 1] * 587 + imgData[point + 2] * 299 + 500) / 1000;   // 视觉公式
                break;
            }                        
            // 数据写入                        
			imgData[point] = imgData[point + 1] = imgData[point + 2] = gray;
		}
	}
}

3、24 位真彩图转换成 8 位灰度图片

/************************************************************
*Function:		Bmp24_2_GrayBmp8
*Description:	讲 24 位真彩图图片 转换成 8 位灰度图片
*Params:		imgData - 位图数据
*				width - 图像宽度
*				height - 图像高度
*				mode - 灰度化方式,枚举类型
*Return:		None
************************************************************/
uint8_t* Bmp24_2_GrayBmp8(uint8_t* imgData, uint32_t width, uint32_t height, int mode)
{		
	// 计算真实的行字节
    uint32_t realWidth = WidthBytes(width * 24);	    // 原始图片的真实行字节
	uint32_t dstRealWidth = WidthBytes(width * 8);      // 目标图片的真实行字节

    // 数据的写入
	uint32_t num = 0;        // 在结果数组中,定位真实的数据位置
	uint8_t* dstData = new uint8_t[dstRealWidth * height]();    // 开辟结果图像空间
    // 计算计算与写入	
	for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < dstRealWidth; j++) {           // 此时的 宽 为 行字节,保障完全被处理
			uint8_t gray = 0;
            uint32_t point = i * realWidth + j * 3;	            
            // 模式选择
            switch (mode)           
            {
            case 1:
                gray = (imgData[point] + imgData[point + 1] + imgData[point + 2]) / 3;   // 平均计算
                break;            
            default:
                gray = (imgData[point] * 114 + imgData[point + 1] * 587 + imgData[point + 2] * 299 + 500) / 1000;   // 视觉公式
                break;
            }      
			dstData[num++] = gray;
		}
	}

	return dstData;
}
一只连 ID 都重复的菜狗 发布了101 篇原创文章 · 获赞 1 · 访问量 1229 私信 关注

标签:24,gray,point,八位,灰度,imgData,uint32,图片
来源: https://blog.csdn.net/qq_40905739/article/details/104544162