在2D数组中查找相邻像素而不会超出范围

时间:2019-02-02 08:13:14

标签: java arrays

我正在寻找2D阵列中的相邻像素。使用一个欧几里德距离的公式和一个任意数字,我想确定像素pix1和相邻像素pix2之间的“色差”是否大于65。如果是,请将相邻像素pix2更改为黑色,否则请更改为白色。现在,我意识到一个像素在2D阵列中最多可以有8个邻居。

为此,我得到了其他.java文件,它们提示您选择任何图像,并使用我编写的此程序,将根据提到的“色差”输出黑白图像。

尽管执行效率很低,但我实现了一系列if语句来检查2D数组中的边界,但是我似乎找不到一个错误。

编辑:不再越界,但指针错误为空。

当我放弃退货声明时。

export default class Child extends React.Component {
  constructor() {
    super();
    this.state = {
      options: []
    };
  }

  static getDerivedStateFromProps(nextProps, prevState) {
        let { data } = nextProps;
        let options = Object.keys(data).reduce((acc, curr) => {
            return [...acc, { label: data[curr], value: curr.replace( /^\D+/g, '') }]
    }, []);
        //or
        /*
        let options= Object.keys(nextProps.data).map((key, index) => ({label: nextProps.data[key], value: index}))};
        */
        return { options };
  }

  render() {
    return (
    this.state.options.map(item => <p key={item.value}>{item.label}</p>)
    );
  }
}

我不知道它应该返回什么,我只想改变像素的颜色。清楚地对象是我理解不足的区域。

另外,当添加一个return语句:“ return result”时,我得到一个空指针异常,该异常引用其他Java文件

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    This method must return a result of type Color[][]

更新的代码:

Exception in thread "main" java.lang.NullPointerException
    at ImageConverter.arrayToBufferedImage(ImageConverter.java:45)
    at ImageWriter.writeImage(ImageWriter.java:16)
    at ImageProcessing.processImage(ImageProcessing.java:164)
    at ImageProcessing.main(ImageProcessing.java:186)

}

3 个答案:

答案 0 :(得分:1)

可以遍历相邻使用2嵌套for循环像以下8个像素

.then(function(data) {
  data.messages = data.messages.slice(Math.max(data.messages.length - 10, 0))

  for (var i = 0; i < data.messages.length; i++) {
    var time = Math.round(new Date().getTime() / 1000);
    if (data.messages[i].time < time) {
      console.log(data.messages[i].message);
    }
  }
});

或者甚至更简单的选择是存储存储坐标偏移量等for (int i = 0; i < numberOfRows; i++) for (int j = 0; j < numberOfColumns; j++) { for(i1 = -1; i1 <= 1; i1++) { for(j1 = -1; j1 <= 1; j1++) { if(!(i1 == 0 && j1 == 0) && i + i1 >=0 && i + i1 < numberOfRows && j + j1 >= 0 and j + j1 < numberOfColumns) { pix2 = imagingArray[i+i1][j+j1]; } } } } } (我让你找出其余4个偏移)

的邻居8个元素的数组

答案 1 :(得分:0)

该错误可能发生在代码中的多个位置,您在此处检查上限。 例如:

            if (i < numberOfRows && j>0) {
                pix2 = imagingArray[i+1][j];//to the right of current pixel

这里i可以等于numberOfRows-1,然后当您尝试访问i+1时,您将得到上述异常

您需要记住,数组索引从0length-1

答案 2 :(得分:-1)

我建议您不要在if语句(例如if (j > 0))中包围每个“模块”,而应将它们围在try-catch中。这意味着它是不可能收到IndexOutOfBoundsException。这样做看起来像这样:

try {
    if (i < numberOfRows) {
        // ..do whatever you did here
    }
} catch (IndexOutOfBoundsException e) {
    // do nothing because you hit the edge
}

对每个if语句执行此操作,它应该可以工作。

希望这会有所帮助!

编辑:这样做,这样具有容易看到发生异常的地方,如果你想另一个振作。只需将e.printStackTrace()放在受影响的catch块中即可。