当前位置: 首页 > 知识库问答 >
问题:

如何对Java中的像素进行算术运算

刁钧
2023-03-14

我必须为图像中的所有像素添加一些常量值 - 对于灰色图像和彩色图像。但我不知道我该怎么做。我通过BufferedImage阅读图像,并且我正在尝试获取2d像素数组。我发现了类似BufferedImage.getRGB()的东西,但它返回奇怪的值(负值和巨大值)。如何为我的缓冲图像添加一些价值?

共有2个答案

郭胤
2023-03-14

若要向所有像素添加常量值,可以使用 RescaleOp。您的常量将是每个通道的偏移量。将 scale 保留为 1.0提示可能为 null

// Positive offset makes the image brighter, negative values makes it darker
int offset = 100; // ...or whatever your constant value is
BufferedImage brighter = new RescaleOp(1, offset, null)
                                 .filter(image, null);

要更改当前图像,而不是创建新图像,您可以使用:

new RescaleOp(1, offset, null)
        .filter(image, image);
艾照
2023-03-14

您可以使用:

byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

获取图像中所有像素的byte[],然后在byte[]上循环,将您的常量添加到每个字节元素。

如果您想将字节转换成二维字节[],我找到了一个可以做到这一点的例子(获得二维像素数组)。

总之,代码看起来像这样:

private static int[][] convertToArrayLocation(BufferedImage inputImage) {
   final byte[] pixels = ((DataBufferByte) inputImage.getRaster().getDataBuffer()).getData(); // get pixel value as single array from buffered Image
   final int width = inputImage.getWidth(); //get image width value
   final int height = inputImage.getHeight(); //get image height value
   int[][] result = new int[height][width]; //Initialize the array with height and width

    //this loop allocates pixels value to two dimensional array
    for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel++) {
       int argb = 0;
       argb = (int) pixels[pixel];

       if (argb < 0) { //if pixel value is negative, change to positive 
          argb += 256;
       }

       result[row][col] = argb;
       col++;

       if (col == width) {
          col = 0;
          row++;
       }
   }

   return result; //return the result as two dimensional array
} //!end of method!//
 类似资料:
  • 我有一个具有两个数据成员的泛型类。这是我写的一段代码 我想对num1和num2进行简单的算术运算,比如加法和减法,我还想进行简单的二进制运算,比如 但是这是不允许的,那么有人能告诉我如何执行这些任务吗?

  • 问题内容: 我一直在阅读有关Go中的常量的文章,并且试图了解它们如何在内存中存储和使用。您可以在Go中对非常大的常量执行运算,并且只要结果适合内存,就可以将结果强制为类型。例如,如您所料,此代码显示: 这是如何工作的?在某个时候,Go必须存储并存储在内存中,以便对其执行操作。那么常量是如何存储的,Go如何对其进行算术运算呢? 问题答案: 简短摘要(TL; DR)在答案的结尾。 无类型的任意精度常量

  • 问题内容: 我在csv文件中有一个日期列,说有这种格式的日期,我还有另外一列。在列中,我要填充紧接在日期列中提到的日期之后的日期。例如。如果date列具有日期,那么我想在Next_Day列中。 我们可以在excel中使用,但我不知道如何在Python中执行此操作。 请帮助我解决这个问题。 问题答案: 使用

  • 问题内容: 这是我在Swift编程中的第一天,到现在为止,我们一直在使用ObjectiveC。喜欢, 但是,当我将其中一个值更改为float时,会出现错误。 错误:main.swift:13:11:找不到接受提供的参数的’+’的重载 现在,我进行了Google搜索,并尝试了一些尝试,例如,但是它不起作用。Swift在这种情况下应该将int隐式转换为float,不是吗? 如果我在理解Swift语言时

  • 主要内容:一元运算符,二元运算符,算术赋值运算符运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的。 Java 语言中的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进行运算还是自右向左进行运算。这些 运算符按照操作数的数量可以分为单目运算符、双目运算符和三目运算符。 最基本的运算符包

  • 涉及函数cv2.add(),cv2.addWeighted() 一、图像加法 使用cv2.add()将两幅图像进行加法运算,也可以直接使用numpy,res=img1+img2.两幅图像的大小,类型必须一致,或者第二个图像可以是一个简单的标量值。 openCV的加法是一种饱和操作,而numpy的加法是一种模操作。 x=np.uint8([250]) y=np.uint8([10]) print(c