C RGB565到灰度

C RGB565到灰度,c,image-processing,rgb,grayscale,C,Image Processing,Rgb,Grayscale,我正在尝试将RGB565转换为灰度图像 我使用下面的代码进行转换。我有一个rgb565像素。我得到R,G和B的值,并进行转换操作。一旦获得灰度,我将重建16位像素值,其中R、G和B将具有相同的灰度值 int16_t pixel = *buffer; int16_t red = ((pixel & 0xF800)>>11); int16_t green = ((pixel & 0x07E0)>>5); int16_t blue = (pixel &a

我正在尝试将RGB565转换为灰度图像

我使用下面的代码进行转换。我有一个rgb565像素。我得到R,G和B的值,并进行转换操作。一旦获得灰度,我将重建16位像素值,其中R、G和B将具有相同的灰度值

 int16_t pixel = *buffer;
 int16_t red = ((pixel & 0xF800)>>11);
 int16_t green = ((pixel & 0x07E0)>>5);
 int16_t blue = (pixel & 0x001F);
 int16_t grayscale = (0.2126 * red) + (0.7152 * green) + (0.0722 * blue);
 *buffer=(grayscale<<11)+(grayscale<<5)+grayscale;
int16\u t像素=*缓冲区;
int16_t red=((像素&0xF800)>>11);
int16_t绿色=((像素&0x07E0)>>5);
int16_t蓝色=(像素&0x001F);
int16_t灰度=(0.2126*红色)+(0.7152*绿色)+(0.0722*蓝色);

*buffer=(灰度绿色
组件有6位,不是因为它需要更高的值,而是因为它需要更高的分辨率(请参阅)

因此,要使值范围等于
红色
蓝色
,只需将
绿色
值除以2:

 int16_t pixel = *buffer;
 int16_t red = ((pixel & 0xF800)>>11);
 int16_t green = ((pixel & 0x07E0)>>5);
 int16_t blue = (pixel & 0x001F);
 int16_t grayscale = (0.2126 * red) + (0.7152 * green / 2.0) + (0.0722 * blue);
 //                                                   ^^^^^
 *buffer=(grayscale<<11)+(grayscale<<6)+grayscale;
int16\u t像素=*缓冲区;
int16_t red=((像素&0xF800)>>11);
int16_t绿色=((像素&0x07E0)>>5);
int16_t蓝色=(像素&0x001F);
int16_t灰度=(0.2126*红色)+(0.7152*绿色/2.0)+(0.0722*蓝色);
//                                                   ^^^^^

*缓冲区=(灰度计算得到的
grayscale
值比要分配的最终字段大3倍。此外,R和B分量相对于G有一半的比例。尝试将其缩放为“*buffer=((灰度/2)/3)谢谢你的回复!但是,我不理解你的缩放背后的概念?你能解释一下吗?@Frankie_C我也不理解你的评论。@SindujaPrakash一个快速的计算表明,
灰度值可以达到53左右。因此它不能在5位上编码。你的黑白转换公式似乎不正确考虑到
绿色
红色
蓝色
没有相同的表示/大小。在计算
灰度
之前,你可能应该将
绿色
除以2。谢谢你的帮助!我还试着忽略绿色的LSB。你认为这是另一个好的可能性吗ble解决方案?您还需要将输出缓冲区中的绿色分量乘以2(或者只需更改
,谢谢您的帮助!它确实有效!!耶(更改为