计算3维空间中2个点之间的“颜色距离”

时间:2019-01-31 21:29:53

标签: java

我有一个家庭作业,必须编写一个负责轮廓检测的类。它本质上是一种图像处理操作,使用的是3维空间中2个点之间的欧式距离的定义。提供给我们使用的公式是:

Math.sqrt(Math.pow(pix1.red-pix2.red,2)+ Math.pow(pix1.green- pix2.green,2)+ Math.pow(pix1.blue- pix2.blue,2 ));

我们需要考虑存储图像像素颜色的二维数组的每个条目,如果某个像素pix(p与任何相邻像素之间的颜色距离大于70),请更改像素为黑色,否则将其更改为白色。

我们还获得了一个单独的类,负责选择图像和选择输出,将其应用于operationContouring方法。从python开始,Java语法和约定对我来说是非常新的。从概念上讲,我正在努力了解pix1和pix2之间的区别以及如何定义它们。到目前为止,这是我的代码。

给出:

import java.awt.Color;

/* Interface for ensuring all image operations invoked in same manner */
public interface operationImage {
    public Color[][] operationDo(Color[][] imageArray);
}

我的代码:

    import java.awt.Color;

public class operationContouring implements operationImage {

    public Color[][] operationDo(Color[][] imageArray) {
        int numberOfRows = imageArray.length;
        int numberOfColumns = imageArray[0].length;

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

        for (int i = 0; i < numberOfRows; i++)
            for (int j = 0; j < numberOfColumns; j++) {
                int red =  imageArray[i][j].getRed();
                int green = imageArray[i][j].getGreen();
                int blue = imageArray[i][j].getBlue();              

                double DistanceColor =  Math.sqrt(Math.pow(pix1.red - pix2.red,2) + Math.pow(pix1.green- pix2.green,2) + Math.pow(pix1.blue- pix2.blue,2));

                int LIMIT = 70;

                if (DistanceColor> LIMIT ) {
                    results[i][j] = new Color((red=0), (green=0), (blue=0));
                }
                else {
                    results[i][j] = new Color((red=255), (green=255), (blue=255));
                }
            }
        return results;
    }

}

1 个答案:

答案 0 :(得分:0)

这是我写的使用BufferedImages的解决方案。我测试了它,它应该可以工作。尝试更改它,使其使用您的数据格式(Color [] []),它也应为您工作。请注意,“ pix1”仅是对某些像素的颜色的描述,而“ pix2”是与之比较的像素的颜色的描述(确定颜色距离是否大于70)。

public static boolean tooDifferent(Color c1, Color c2) {
    return  Math.sqrt(Math.pow(c1.getRed() - c2.getRed(),2) + Math.pow(c1.getGreen()- c2.getGreen(),2) + Math.pow(c1.getBlue()- c2.getBlue(),2)) > 70;
}

public static Color getColor(int x, int y, BufferedImage img) {
    return new Color(img.getRGB(x, y));
}


public static BufferedImage operationDo(BufferedImage img) {
    int numberOfRows = img.getHeight();
    int numberOfColumns = img.getWidth();

    BufferedImage results = new BufferedImage(numberOfColumns, numberOfRows, BufferedImage.TYPE_INT_ARGB);

    for (int y = 0; y < numberOfRows; y++) {
        for (int x = 0; x < numberOfColumns; x++) {
            Color color = new Color(img.getRGB(x, y));

            boolean aboveExists = y > 0;
            boolean belowExists = y < numberOfRows - 1;
            boolean leftExists = x > 0;
            boolean rightExists = x < numberOfColumns - 1;

            if ((aboveExists && tooDifferent(color, getColor(x, y - 1, img))) ||
                    (belowExists && tooDifferent(color, getColor(x, y + 1, img))) ||
                    (leftExists && tooDifferent(color, getColor(x - 1, y, img))) ||
                    (rightExists && tooDifferent(color, getColor(x + 1, y, img)))) {
                results.setRGB(x, y, Color.black.getRGB());
            } else {
                results.setRGB(x, y, Color.white.getRGB());
            }

        }
    }
    return results;
}