java-将像素值转换为0到255
好的,我使用以下代码从文件中提取了RGB值-:java-将像素值转换为0到255,java,image-processing,Java,Image Processing,好的,我使用以下代码从文件中提取了RGB值-: int r = cBuffer[1024*0+32*(j/32)+(j%32)] & 0xFF; int g = cBuffer[1024*1+32*(j/32)+(j%32)] & 0xFF; int b = cBuffer[1024*2+32*(j/32)+(j%32)] & 0xFF; int pi
int r = cBuffer[1024*0+32*(j/32)+(j%32)] & 0xFF;
int g = cBuffer[1024*1+32*(j/32)+(j%32)] & 0xFF;
int b = cBuffer[1024*2+32*(j/32)+(j%32)] & 0xFF;
int pixel = (r << 16) | (g << 8) | b;
使用0xFF进行“anding”是因为我想将字节值转换为无符号表示
现在,我使用以下代码形成实际像素-:
int r = cBuffer[1024*0+32*(j/32)+(j%32)] & 0xFF;
int g = cBuffer[1024*1+32*(j/32)+(j%32)] & 0xFF;
int b = cBuffer[1024*2+32*(j/32)+(j%32)] & 0xFF;
int pixel = (r << 16) | (g << 8) | b;
我知道像素计算是正确的,因为我使用这些值后得到的图像是有效的
现在我的问题是-:
- 为什么会有这样任意的像素值?像素值不应该在0到255之间吗
- 在给定rgb值的情况下,是否有任何方法可以表示0到255之间的像素值?这是正确的表述吗
int
将具有更高的绝对值
在给定rgb值的情况下,是否有任何方法可以表示0到255之间的像素值?这是正确的表述吗
不,如上所述,24位像素值不能在0-255范围内表示。您通常会表示该范围内的每个组件(r、g、b),即一个像素将由0-255范围内的3个值组成
有一些表示法允许您将像素映射到0-255,但会丢失很多信息,因为您必须将其转换为灰度,或者将rgb值“压缩”为2或3位值,这显然不能容纳8位值那么多的信息
顺便说一句,我不确定您的rgb提取例程是否正确,或者至少它看起来非常复杂(您是否检查了值是否正确?)。假设cBuffer
是一个字节数组,表示未压缩的32位颜色信息,您可能会得到如下rgb值:
//assuming the buffer to be in rgba format, i.e. 32-bit pixels with alpha information in the last byte
for( int i = 0; i < cBuffer.length; i+=4) {
int r = cBuffer[i];
int b = cBuffer[i + 1];
int g = cBuffer[i + 2];
int a = cBuffer[i + 3];
//do whatever you want with the pixel
}
int w = 255 << 16 | 255 << 8 | 255; //white = 0x00FFFFFF
int r = 255 << 16; //red = 0x00FF0000
int g = 255 << 8; //green = 0x0000FF00
int b = 255; //blue = 0x000000FF
System.out.format( "white > int: %8d (real: %1.5f )\n", w, (double)w/w);
System.out.format( "red > int: %8d (real: %1.5f )\n", r, (double)r/w);
System.out.format( "green > int: %8d (real: %1.5f )\n", g, (double)g/w);
System.out.format( "blue > int: %8d (real: %1.5f )\n", b, (double)b/w);
像素值不应该在0到255之间吗
不,您应该知道,由于您正在使用移位字节等,0-255将是无符号字节的值范围,并且由于像素值通常由3个8位(即3个字节)值组成,因此生成的int
将具有更高的绝对值
在给定rgb值的情况下,是否有任何方法可以表示0到255之间的像素值?这是正确的表述吗
不,如上所述,24位像素值不能在0-255范围内表示。您通常会表示该范围内的每个组件(r、g、b),即一个像素将由0-255范围内的3个值组成
有一些表示法允许您将像素映射到0-255,但会丢失很多信息,因为您必须将其转换为灰度,或者将rgb值“压缩”为2或3位值,这显然不能容纳8位值那么多的信息
顺便说一句,我不确定您的rgb提取例程是否正确,或者至少它看起来非常复杂(您是否检查了值是否正确?)。假设cBuffer
是一个字节数组,表示未压缩的32位颜色信息,您可能会得到如下rgb值:
//assuming the buffer to be in rgba format, i.e. 32-bit pixels with alpha information in the last byte
for( int i = 0; i < cBuffer.length; i+=4) {
int r = cBuffer[i];
int b = cBuffer[i + 1];
int g = cBuffer[i + 2];
int a = cBuffer[i + 3];
//do whatever you want with the pixel
}
int w = 255 << 16 | 255 << 8 | 255; //white = 0x00FFFFFF
int r = 255 << 16; //red = 0x00FF0000
int g = 255 << 8; //green = 0x0000FF00
int b = 255; //blue = 0x000000FF
System.out.format( "white > int: %8d (real: %1.5f )\n", w, (double)w/w);
System.out.format( "red > int: %8d (real: %1.5f )\n", r, (double)r/w);
System.out.format( "green > int: %8d (real: %1.5f )\n", g, (double)g/w);
System.out.format( "blue > int: %8d (real: %1.5f )\n", b, (double)b/w);
为什么会有这样任意的像素值?一个像素不应该吗
值范围从0到255
- 灰度图像中的像素由1个通道和1个字节表示,因此取值介于0和255之间李>
- 彩色图像中的像素由3个通道表示-R、G、B(有时还有第4个通道称为alpha通道),因此在图像宽度上有3个连续字节。因此,这样的像素不能用0到255之间的值来表示。但是,三个通道(R、G、B)中每个通道的值表示在0和255之间李>
byte[] pixel = new byte[3];
/* code to read the pixel in this byte array */
int r = pixel[0] & 0xFF;
int g = pixel[1] & 0xFF;
int b = pixel[2] & 0xFF;
注意通道字节与0xFF(255)的“ANDIN”。此操作使字节值变为无符号值
为什么会有这样任意的像素值?一个像素不应该吗
值范围从0到255
- 灰度图像中的像素由1个通道和1个字节表示,因此取值介于0和255之间李>
- 彩色图像中的像素由3个通道表示-R、G、B(有时还有第4个通道称为alpha通道),因此在图像宽度上有3个连续字节。因此,这样的像素不能用0到255之间的值来表示。但是,三个通道(R、G、B)中每个通道的值表示在0和255之间李>
byte[] pixel = new byte[3];
/* code to read the pixel in this byte array */
int r = pixel[0] & 0xFF;
int g = pixel[1] & 0xFF;
int b = pixel[2] & 0xFF;
注意通道字节与0xFF(255)的“ANDIN”。此操作使字节值变为无符号值 因此,如果您不想丢失信息,就无法获得o到255?@Machina333之间的表示形式,而不是单个像素值。你凭什么认为这是可能的?您想用它实现什么?我正在尝试制作CIFAR图像的数据集。为了做到这一点,所有像素值必须规格化为0到1之间。所以,如果我可以得到一个介于0到255之间的表示,或者任何其他的最大值,我可以将每个元素除以它,得到一个介于0到255之间的值1@Machina333真的是0比1(即0或1)还是0.0比1.0(即0.5等)