java - 将Pixel值转换为0到255

时间:2016-02-12 09:20:01

标签: 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;

" anding"完成0xFF是因为我想将字节值转换为无符号表示。

现在我使用以下代码形成实际像素 - :

int pixel = (r << 16) | (g << 8) | b;

现在的问题是,当我打印(使用SOP(像素))像素的值时,我得到如下数字 - :

Computed Pixel = -11119787
Computed Pixel = -13884637
Computed Pixel = -14081500
Computed Pixel = -12436417

我知道像素计算是正确的,因为我使用这些值后获得的图像是有效的。

现在我的问题是 - :

  • 为什么像素有这样的任意值?不应该是0到255之间的像素值吗?
  • 在给定rgb值的情况下,有什么办法可以表示0到255之间的像素值吗?这甚至是一个正确的代表吗?

2 个答案:

答案 0 :(得分:2)

  

像素值不应该介于0到255之间吗?

不,你应该知道,因为你正在处理移位字节等.0-255将是无符号字节的值范围,因为像素值通常由3个8位(即3字节)值组成,结果int的绝对值会更高。

  

在给定rgb值的情况下,有什么方法可以表示0到255之间的像素值?这甚至是一个正确的代表吗?

不,如上所述,24位像素值不能在0到255范围内表示。您通常代表该范围内的每个分量(r,g,b),即像素将包含3个值在0-255范围内。

有些表示允许您将像素映射到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
}

修改

根据您的评论,您希望获得范围[0.0,1.0]中的颜色值。在这种情况下,您将获得整数颜色值并将其除以最大颜色值(白色)。假设您有24位颜色(或32位argb并忽略alpha分量),您可以执行以下操作:

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

输出:

white > int: 16777215 (real: 1,00000 )
red   > int: 16711680 (real: 0,99609 )
green > int:    65280 (real: 0,00389 )
blue  > int:      255 (real: 0,00002 )

答案 1 :(得分:0)

  

为什么像素有这样的任意值?不应该像素   值范围是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)。该操作使字节值变为无符号值。