gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:57:41 27 4
gpt4 key购买 nike

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

  1. 将图像转换为二维像素数组(这样我就可以更改像素值)
  2. 更改图像的对比度和亮度
  3. 将更改后的像素数组转换为图像(最好是 BufferedImage)
  4. 在 JFrame 中显示原始图像和更改后的图像

我可以毫无问题地执行步骤 4,并且我认为我也正确执行了步骤 1。然而,我无法开始工作的是步骤 2 和 3。我尝试了不同的方法,但最终总是得到一个非常扭曲的图像。只需将图像转换为像素数组,然后再次转换回图像(不更改像素值),就会产生不应该出现的非常扭曲的图像。请看下面的图片。 enter image description here

这是一项学校作业,因此我们必须自己实现此功能(更改对比度和亮度),否则我会使用类似 question 中建议的一些内置函数。 .

有谁可以帮忙吗?预先感谢您的帮助!

我的代码

我已将每个步骤(步骤 4 除外)放在单独的方法中,以使其更易于阅读和理解。

图像 --> 二维像素阵列

/**
* converts an image to a 2 dimensional pixel-array
*/
public static int[][] imageToPixelArray() throws IOException {
File file = new File(filename);
imageOriginal = ImageIO.read(file);
Raster raster = imageOriginal.getData();
int width = raster.getWidth();
int height = raster.getHeight();
pixels = new int[width][height];

sampleModel = raster.getSampleModel();
int color = 3;

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);
}
}
}
return pixels;
}

更改像素值

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

二维像素阵列 --> 图像

/**
* 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;
}

最佳答案

你的整个代码没有意义。我不会说任何关于语法的事情,因为我的 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);
}
}
}

为什么要连续将三个不同的值分配给同一个整数pixels[i][j]?您可以使用另一个数组来存储每个像素的三个值,也可以找到其他方法来编码 RGB 信息。

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

你是如何得出像素[i][j] = 像素[i][j] * 对比度 + 亮度;?这不会改变对比度,只是使图像更亮。对比度不是一个全局因素。我认为您需要了解一些有关数字图像、其结构和值的基本知识,以及最少的图像处理术语。

如果将 RGB 图像缩小为单个 channel ,则会丢弃无法恢复的信息。不幸的是,你并没有真正描述你想要实现的目标,所以我无法给你很多建议。但你的代码是无稽之谈。

关于java - 如何更改存储为二维像素阵列的彩色图像的对比度和亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com