Java 如何更改存储为二维像素阵列的彩色图像的对比度和亮度

Java 如何更改存储为二维像素阵列的彩色图像的对比度和亮度,java,image,image-processing,Java,Image,Image Processing,我有一个图像存储为二维像素值数组。我想更改图像的对比度和亮度,然后将更改后的像素阵列存储为图像,然后在JFrame中显示原始图像和更改后的图像。因此,我的问题的基本步骤是: 将图像转换为二维像素阵列,以便更改像素值 更改图像的对比度和亮度 将更改后的像素阵列转换为图像,最好是BuffereImage 在JFrame中显示原始图像和修改后的图像 我可以做第四步没问题,我想我也做对了第一步。然而,我无法开始工作的是第2步和第3步。我尝试过不同的方法,但最终总是得到一个非常扭曲的图像。只需将图像转换为

我有一个图像存储为二维像素值数组。我想更改图像的对比度和亮度,然后将更改后的像素阵列存储为图像,然后在JFrame中显示原始图像和更改后的图像。因此,我的问题的基本步骤是:

将图像转换为二维像素阵列,以便更改像素值 更改图像的对比度和亮度 将更改后的像素阵列转换为图像,最好是BuffereImage 在JFrame中显示原始图像和修改后的图像 我可以做第四步没问题,我想我也做对了第一步。然而,我无法开始工作的是第2步和第3步。我尝试过不同的方法,但最终总是得到一个非常扭曲的图像。只需将图像转换为像素阵列,然后在不改变像素值的情况下再次返回图像,就可以在不应该的情况下生成非常扭曲的图像。请看下面的图片。

这是一个学校作业,所以我们必须自己实现这个功能来改变对比度和亮度,否则我会使用一些内置的功能,就像在这个类似的例子中建议的那样

有人能帮忙吗?提前感谢您的帮助

我的代码

我把除了第4步以外的每一步都放在一个单独的方法中,以使它更容易阅读和理解

图像->二维像素阵列

更改像素值

二维像素阵列->图像


你的整个代码没有意义。我不会说任何关于语法的事情,因为我的Java已经很生疏了,我不会给你一个解决方案,因为这会伤害你的学习经验。但我要指出一些事情

for(int i = 0; i < width; i++) {
  for(int j = 0; j < height; j++) {
     for(int c = 0; c < color; c++) {
        pixels[i][j] = raster.getSample(i, j, c);
     }
  }
}
你是怎么想到像素[i][j]=像素[i][j]*对比度+亮度;? 这不会改变对比度,只会使图像更亮。对比度不是一个全球性因素。我认为你需要获得一些关于数字图像的基本知识,它们的结构和价值,以及图像处理术语的最低限度


如果将rgb图像缩小为单个通道,则会丢弃无法恢复的信息。不幸的是,你没有真正描述你想要实现的目标,所以我不能给你很多建议。但是你的代码毫无意义。

我设法解决了我的问题,并在此过程中缩短了代码!我的代码通过生成一个由间隔给定的随机值来更改亮度和对比度

如果其他人也有同样的问题,下面是代码:

/**
 * alter the image´s contrast and brightness
 * @throws IOException
 */
public void alterImage() throws IOException {
    imageAltered = new BufferedImage(imageOriginal.getWidth(), imageOriginal.getHeight(), BufferedImage.TYPE_INT_RGB);
    brightness = rand.nextInt(150 + 200 + 1) - 200; //values from 150 to 200
    contrast = 1.5 + (5.0 - 1.5) * rand.nextDouble(); //values from 1.5 to 5.0

    for(int i = 0; i < imageOriginal.getWidth(); i++) {
        for(int j = 0; j < imageOriginal.getHeight(); j++) {
            Color c = new Color(imageOriginal.getRGB(i, j));
            int red = (int) contrast * c.getRed() + brightness;
            int green = (int) contrast * c.getGreen() + brightness;
            int blue = (int) contrast * c.getBlue() + brightness;

            if(red > 255) { // the values of the color components must be between 0-255
                red = 255;
            } else if(red < 0) {
                red = 0;
            }
            if(green > 255) {
                green = 255;
            } else if(green < 0) {
                green = 0;
            }
            if(blue > 255) {
                blue = 255;
            } else if(blue < 0) {
                blue = 0;
            }
            imageAltered.setRGB(i, j, new Color(red, green, blue).getRGB());
        }
    }
}

教授给我们的公式是像素[i][j]=像素[i][j]*对比度+亮度。这是关于图像处理主题的第一个作业,我以前从未学习过,因此我对该主题的知识有限,代码混乱。我认为有必要将图像转换为2D阵列,以便能够逐像素地对其进行操作,然后将其转换回BuffereImage,以便能够显示图像。几个小时后,我终于解决了我的问题@猪仔
/**
 * converts a 2 dimensional pixel-array to an image
 */
public static BufferedImage pixelArrayToImage(int[][] pixels) {
    int width = pixels.length;
    int height = pixels[0].length;
    WritableRaster raster = Raster.createWritableRaster(sampleModel, new Point(0, 0));

    for(int i = 0; i < width; i++) {
        for(int j = 0; j < height; j++) {
            raster.setSample(i, j, 0, pixels[i][j]);
        }
    }

    imageAltered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    imageAltered.setData(raster);
    return imageAltered;
}
for(int i = 0; i < width; i++) {
  for(int j = 0; j < height; j++) {
     for(int c = 0; c < color; c++) {
        pixels[i][j] = raster.getSample(i, j, c);
     }
  }
}
public static int[][] compute(int[][] pixels) {
    contrast = 20;
    brightness = 20;
    for(int i = 0;  i < pixels.length; i++) {
        for(int j = 0; j < pixels[i].length; j++) {
            pixels[i][j] = pixels[i][j] * contrast + brightness;
        }
    }
    return pixels;
}
/**
 * alter the image´s contrast and brightness
 * @throws IOException
 */
public void alterImage() throws IOException {
    imageAltered = new BufferedImage(imageOriginal.getWidth(), imageOriginal.getHeight(), BufferedImage.TYPE_INT_RGB);
    brightness = rand.nextInt(150 + 200 + 1) - 200; //values from 150 to 200
    contrast = 1.5 + (5.0 - 1.5) * rand.nextDouble(); //values from 1.5 to 5.0

    for(int i = 0; i < imageOriginal.getWidth(); i++) {
        for(int j = 0; j < imageOriginal.getHeight(); j++) {
            Color c = new Color(imageOriginal.getRGB(i, j));
            int red = (int) contrast * c.getRed() + brightness;
            int green = (int) contrast * c.getGreen() + brightness;
            int blue = (int) contrast * c.getBlue() + brightness;

            if(red > 255) { // the values of the color components must be between 0-255
                red = 255;
            } else if(red < 0) {
                red = 0;
            }
            if(green > 255) {
                green = 255;
            } else if(green < 0) {
                green = 0;
            }
            if(blue > 255) {
                blue = 255;
            } else if(blue < 0) {
                blue = 0;
            }
            imageAltered.setRGB(i, j, new Color(red, green, blue).getRGB());
        }
    }
}