调节RGB颜色的亮度

先说一下问题,图像经过H.264编码后,按钮上的文字与背景糊做一团,无法辨认。完全看不清按钮上的文字。

分析原因,按钮上的文字的颜色与背景颜色太过接近,导致编码后糊做一团。更换文字颜色后,问题解决。但客户要求,不能改变文字的颜色。于是,进一步分析,导致糊成一团的根本原因并不是颜色的RGB值接近,而是两种色的亮度值接近。因为原始在RGB图像在生成h.264时,中间过程需要先转换成YUV数据,当两种相邻色的亮度值相近时,就容易导致糊。

既然如此,解决方案就是拉大相邻两色的亮度值差即可。先把文字颜色的RGB值录入到画图程序的编辑颜色中,查看其转换后的亮度值,调高亮度值生成新的RGB值。之后通过修改代码,从原始RGB数据中拿到文字的RGB数据,做对应修改即可。

在此过程中,运用到的知识包括H.264编码原理、RGB数据格式、YUV数据格式、颜色转换相关知识等。

相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void rgb2rgba(unsigned char* rgb, unsigned char* rgba, int w, int h)
{
	int index = 0;
	while (index < w * h * 3)
	{
		*rgba++ = *rgb++;
		index++;
		if (index % 3 == 0) 
		{
			if (*(rgba - 3) == 231 && *(rgba - 2) == 24 && *(rgba - 1) == 174)
			{
				// 80 170 80 - 30 30 220 - 100 20 220 - 243 139 215
				*(rgba - 3) = 243; //b
				*(rgba - 2) = 139; //g
				*(rgba - 1) = 215; //r
			}
			*rgba++ = 0;
		}
	}
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注