我期待找到一个二维数组相邻像素。使用欧氏距离公式,和任意数量,我想找到如果像素,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;
}
}
可以遍历邻国使用嵌套像下面的循环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个偏移)
可发生在代码中的几个地方,在那里你检查上限的错误。例如:
if (i < numberOfRows && j>0) {
pix2 = imagingArray[i+1][j];//to the right of current pixel
这里i
可以等于numberOfRows-1
,然后当您尝试访问i+1
你会得到上述异常
你需要记住,数组索引从0
去length-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
块。