我有一个家庭作业,必须编写一个负责轮廓检测的类。它本质上是一种图像处理操作,使用的是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;
}
}
答案 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;
}