发现在2D阵列的相邻像素而不会超过界限

问题描述 投票:0回答:3

我期待找到一个二维数组相邻像素。使用欧氏距离公式,和任意数量,我想找到如果像素,PIX1之间的“色差”,和相邻的像素,PIX2,为> 65。如果是这样,改变相邻像素,PIX2,黑色,否则更改为白色。现在,我意识到一个像素可以有多达8个邻居在一个二维数组。

对于这个作业,我得到了其他.java文件来选择哪些提示任何图像,并使用这个节目,我正在写,将输出基础上,提到黑白图像“色差”。

我实现了,尽管是非常低效的,一系列的if语句来检查二维数组边界内,但有一个错误的地方,我似乎无法找到。

编辑:不再让出界,但空指针错误。

当我放弃return语句。

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

我不知道是什么,应该回来,我要的是改变像素的颜色。显然,对象是我缺乏理解的区域。

加入return语句也时:“返回结果”,我得到一个空指针异常,它引用其他Java文件

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)

更新的代码:

    import java.awt.Color;

public class OperationContour implements OperationImage {

public Color[][] doOperation(Color[][] imagingArray) {
    int numberOfRows = imagingArray.length;
    int numberOfColumns = imagingArray[0].length;

    Color[][] result = new Color[numberOfRows][numberOfColumns];

    for (int i = 0; i < numberOfRows; i++)
        for (int j = 0; j < numberOfColumns; j++) {

            Color pix1 = imagingArray[i][j];
            Color pix2 = imagingArray[i][j];

            double colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));

            // BELOW
            if (i < numberOfRows-1 && j>0) {
                pix2 = imagingArray[i+1][j];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE; 


        // #2 BOTTOM RIGHT
            if (j < numberOfColumns-1 && i < numberOfRows-1){
                pix2 = imagingArray[i+1][j+1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE;     
                    }
                }

        // #3 BOTTOM LEFT
            if(j > 0 && i < numberOfRows-1){
                pix2 = imagingArray[i+1][j-1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE;     
                    }
                }
            }           

            // ABOVE
            if(i>0 && j>0){
                pix2 = imagingArray[i-1][j];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE;     
                }

            // TOP RIGHT
            if(j < numberOfColumns-1 && i>0){
                pix2 = imagingArray[i-1][j+1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE;     
                }
            }
            //6  TOP LEFT
            if(j > 0 && i>0 ){
                pix2 = imagingArray[i-1][j-1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else {
                    pix1 = Color.WHITE;     
                }
            }

            // 7 RIGHT
            if(j<numberOfColumns-1 && i>0) {
                pix2 = imagingArray[i][j+1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else { 
                    pix1 = Color.WHITE;     
                }
            }
        }
            // 8 LEFT
            if(j>0 && i>0) {
                pix2 = imagingArray[i][j-1];
                colorDifference = Math.sqrt(Math.pow(pix1.getRed() - pix2.getRed(),2) + Math.pow(pix1.getGreen() - pix2.getGreen(),2) + Math.pow(pix1.getBlue() - pix2.getBlue(),2));
                if (colorDifference > 65) {
                    pix1 = Color.BLACK;}
                else { 
                    pix1 = Color.WHITE;}
            }
            }
        }
    return result;
}

}

java arrays
3个回答
1
投票

可以遍历邻国使用嵌套像下面的循环2 8个像素

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

或者更简单的选择是存储存储像[[0, -1], [-1, -1], [-1, 0], [-1, 1]...]邻居坐标偏移8个元素的数组(我会让你找出其余4个偏移)


0
投票

可发生在代码中的几个地方,在那里你检查上限的错误。例如:

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

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

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


-1
投票

我建议,而不是在你包围他们在一个try-catch语句(如if (j > 0))围绕每个“模块”的那个。这意味着它是不可能收到IndexOutOfBoundsException。这样做看起来像这样:

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

这样做对每个if语句,它应该工作。

希望这可以帮助!

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

© www.soinside.com 2019 - 2024. All rights reserved.