我试图将16位(RBG565)隐藏到灰度图像中。我尝试了各种组合的公式,建议在互联网上,所有的工作,为24位RGB888格式。当我尝试使用16位(RBG565)时,图像有蓝色、红色的像素,无法创建精确的灰度图像。请帮帮忙。
公式1比公式2更有效:
公式1:无符号字符灰色=(红色* 77+( (绿色)* 150)/2 +蓝色* 29+128) / 256;
公式2:无符号焦灰=红色* 0.212 +绿色* 0.715 +蓝色* 0.072;
发布于 2021-06-07 10:00:03
由于RGB组件对于每种原色(一般意义上的颜色,意味着颜色合并成其他颜色)都是一个从无颜色到全彩色的比例,我可能会先转换为RGB,然后使用普通的灰色缩放算法(任何您所说的“对24位RGB888都很好”)。
第一个位可能可以使用(大写是8位值,小写是5/6位值):
R = r * 8 ; 256/32, 8-bit from 5-bit
B = b * 4 ; 256/64, 8-bit from 6-bit
G = g * 8 ; 256/32, 8-bit from 5-bit只需确保在提取比特时得到正确的顺序,因为您正在将RBG转换为RGB。
例如,这里有一个完整的C程序(因为您没有提供语言标记),它包含一个函数,但是它使用的是稍微不同的缩放,它依赖于百分比,而不是需要0.255输入的固定值:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
uint16_t greyScale(uint16_t rbg565) {
// Get the values (32-bit to hold larger intermediate values).
uint32_t r = (rbg565 >> 11) & 31U; // XXXXX___________
uint32_t g = rbg565 & 31U; // ___________XXXXX
uint32_t b = (rbg565 >> 5) & 63U; // _____XXXXXX_____
// Scale each of them up to the range 0..500.
g = g * 500 / 31;
b = b * 500 / 63;
r = r * 500 / 31;
// Use example RGB weights of 299/587/114 (summing to 1,000).
// Range then 0..500,000 so divide by 500 to get grey 0..1,000.
uint32_t grey = (r * 299 + g * 587 + b * 114);
grey /= 500;
return (uint16_t)grey;
}
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++) {
uint16_t rbg = atoi(argv[i]);
printf("%5d -> %d\n", rbg, greyScale(rbg));
}
return 0;
}如果您使用一些示例值运行它,您将看到灰度值出来(我添加了注释):
pax:~> ./prog 0 65535 31 $((63*32)) $((31*2048)) $((16*2048+32*32+16))
0 -> 0 # No colour components.
65535 -> 1000 # Max RGB (white).
31 -> 587 # Max green, nothing else.
2016 -> 114 # Max blue, nothing else.
63488 -> 299 # Max red, nothing else.
33808 -> 514 # A little more than half of everything.如果您想使用与我提供的权重不同的权重(29.9%、58.7%和11.4%),只需更改这一行以匹配,确保它们仍然等于1000:
uint32_t grey = (r * 299 + g * 587 + b * 114);https://stackoverflow.com/questions/67869510
复制相似问题