Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-将像素值转换为0到255_Java_Image Processing - Fatal编程技术网

java-将像素值转换为0到255

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

好的,我使用以下代码从文件中提取了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 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之间的像素值?这是正确的表述吗
像素值不应该在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之间吗

不,您应该知道,由于您正在使用移位字节等,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之间
有什么方法可以表示给定的0到255之间的像素值吗 rgb值是多少?这是正确的表述吗

正如我在上面第二点中提到的,可以用0到255之间的值表示每个RGB通道/字节。假设您已读取字节数组中的第一个像素(图像的左上角)

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之间
有什么方法可以表示给定的0到255之间的像素值吗 rgb值是多少?这是正确的表述吗

正如我在上面第二点中提到的,可以用0到255之间的值表示每个RGB通道/字节。假设您已读取字节数组中的第一个像素(图像的左上角)

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等)