【问题标题】:Merging 2 Images Using 2D Arrays as Pixels使用 2D 数组作为像素合并 2 个图像
【发布时间】:2013-07-22 21:40:57
【问题描述】:

我正在尝试根据以下参数合并两个黑白图像。

新创建的数组使用两个图像的宽度和高度中的最大值作为它自己的值。数组中特定点的 int 包含一个表示灰度量的数字。新的二维数组会根据以下条件合并两张图片。

  • 如果位置在两个数组中都存在,则结果数组中的值是数组 a 和 b 中值的平均值。
  • 如果位置只存在于数组a中,则结果数组中的值就是数组a中的值
  • 如果位置只存在于数组b中,则结果数组中的值为数组b中的值
  • 如果该位置不在两个数组中,则在结果数组中的该位置分配值 127。

这是我的代码。由于某种原因,它不会运行,因为它返回 arrayIndexOutOfBounds: 167。如果有人能看一下,我将不胜感激。

public static int[][] merge(int[][] a, int[][] b)
{
    int biggerx = 0;
    int biggery = 0;
    if (a[0].length > b[0].length) {
        biggery = a[0].length;
    }
    else {
        biggery = b[0].length;
    }
    if (a.length > b.length) {
        biggerx = a.length;
    }
    else {
        biggerx = b.length;
    }
    int[][] merged = new int[biggerx][biggery];
    for (int x = 0; x < merged.length; x++) {
        for (int y = 0; y < merged[x].length; y++) {
            if (x <= a.length && y <= a[x].length && x > b.length && y > b[x].length) {
                merged[x][y] = a[x][y];
            }
            else if (x <= b.length && y <= b[x].length && x > a.length && y > a[x].length) {
                merged[x][y] = b[x][y];
            }
            else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
                merged[x][y] = ((a[x][y] + b[x][y]) /2);
            }
            else {
                merged[x][y] = 127;
            }
        }
    }
    return merged;
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java arrays image merge indexoutofboundsexception


【解决方案1】:
else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
    merged[x][y] = ((a[x][y] + b[x][y]) /2); // <= problematic line
}

在这一行中,您尝试到达超出 a 界限的点。在我的示例中,我将 a 设置为 (10, 10),将 b 设置为 (5, 20)。当x = 0, y = 10 时它崩溃了。现在,如您所见,a[0][10] 已超出范围。

这是我的试用代码及其输出:

else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
    System.out.println("x = " + x + " y = " + y);
    System.out.println("merged.length = " + merged.length);
    System.out.println("merged[0].length = " + merged[0].length);
    System.out.println("a.length = " + a.length);
    System.out.println("a[0].length = " + a[0].length);
    System.out.println("b.length = " + b.length);
    System.out.println("b[0].length = " + b[0].length);
    System.out.println();
    System.out.println();
    merged[x][y] = ((a[x][y] + b[x][y]) /2);
}

输出:

x = 0 y = 10

merged.length = 10

merged[0].length = 20

a.length = 10

a[0].length = 10

b.length = 5

b[0].length = 20

编辑:刚刚注意到我提出的解决方案不适用于您。

EDIT2:x &lt;= a.lengthy &lt;= a[x].length 类型的语句需要更改为 x &lt; a.lengthy &lt; a[x].lengthx &lt;= a.length - 1y &lt;= a[x].length - 1

【讨论】:

  • if (x b.length && y > b[x].length) { 合并[x ][y] = a[x][y]; } else if (x a.length && y > a[x].length) { 合并[x][y] = b [x][y]; } else if (x
  • 那么,你需要重新审视你的 if 语句,因为它们允许 a 和 b 的值超出界限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2013-01-17
  • 2021-06-04
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
相关资源
最近更新 更多