下面的代码被编程为在200x200显示器中生成彩色图像。但是,我想知道,假设我想生成另一个窗口,但这个窗口将是一个 200x200 的草图,其中大部分是白色的,但原始图片的颜色边界是黑色的,我如何实现这一点?
简而言之,第一个窗口是彩色的。第二个窗口是第一个窗口的黑白草图。两个窗口将彼此相邻显示。你知道如何产生这样的结果吗?如果是这样,你能帮我吗?
//Setting the size of the graphics window
final int WINDOW_DIMENSION = 200;
EasyGraphics generate = new EasyGraphics(WINDOW_DIMENSION,WINDOW_DIMENSION);
//Constructing the arrays
char[][] firstArray = new char[WINDOW_DIMENSION][WINDOW_DIMENSION];
char[] secondArray = scan.toCharArray();
//Using "for" loop to generate 2D array
int line = WINDOW_DIMENSION;
int column = -1;
for (int i = 0; i < WINDOW_DIMENSION*WINDOW_DIMENSION; i++) {
column++;
if (i%WINDOW_DIMENSION == 0) {
line--;
column = 0;
}
firstArray[column][line]=secondArray[i];
}
//Plotting the colours for respective range of numbers
for (int a = 0; a < WINDOW_DIMENSION; a++) {
for (int b = 0; b < WINDOW_DIMENSION; b++) {
if (firstArray[a][b]=='0' || firstArray[a][b]=='1' || firstArray[a][b]=='2' || firstArray[a][b]=='3') {
generate.setColor(66,167,243);
generate.plot(a,b);
}
else if (firstArray[a][b]=='4' || firstArray[a][b]=='5') {
generate.setColor(0,255,77);
generate.plot(a,b);
}
else if (firstArray[a][b]=='6' || firstArray[a][b]=='7') {
generate.setColor(51,183,91);
generate.plot(a,b);
}
else if (firstArray[a][b]=='8' || firstArray[a][b]=='9') {
generate.setColor(102,51,0);
generate.plot(a,b);
}
}
}
}
您的帮助将不胜感激。
首先,您需要定义什么是边界,如果只是颜色的变化或相同颜色的细微差别被视为相同的边界,如果您考虑细微差别,您应该定义颜色之间的距离(例如 RedDiff+GreenDeff+BlueDiff),如果它小于某个值,则将位着色为黑色。然后你可以做这样的事情:
for (int a = 1; a < WINDOW_DIMENSION; a++) {
for (int b = 1; b < WINDOW_DIMENSION; b++) {
generate.setColor(255,255,255);
if(array[a,b]!=array[a-1,b] || array[a,b]!=array[a,b-1])
generate.setColor(0,0,0);
generate.plot(a,b);
}
}
在此之前,您只需要使用上面的代码构建第一行和第一列,然后将上面的代码用于其他像素
如果"黑白"是指灰度,则需要确定使用哪种渐变。有三种主要方法。假设数组中的每个坐标都有 [R, G, B]。我假设您使用的是AWT颜色。在这种情况下,您可以通过应用亮度方法开发灰度坐标:
int intensity =
(max((double)color.getRed(), (double)color.getGreen(), (double)color.getBlue()}) +
min((double)color.getRed(), (double)color.getGreen(), (double)color.getBlue()})
/ 2) * 255
Color newColor = new Color(intensity, intensity, intensity)
或平均方法:
int intensity = (((double)color.getRed() + (double)color.getGreen() +
(double)color.getBlue())/3)*255;
或亮度法:
int intensity = ((double)color.getRed() * 0.21 +
(double)color.getGreen() * 0.72 +
(double)color.getBlue() * 0.07) * 255;
或者真的任何其他,只要你在相邻颜色之间有一个令人满意的轻盈滑动。
如果你真的只是黑白,那么user1928596的建议肯定会做到;但如果这是一门课程,你以后可能需要调整对色差的敏感度。稍微扩大这个定义,像Photoshop和Gimp这样的程序通常使用误差函数来表示两种相邻颜色之间的差异,以及它们需要多大的差异才能被视为边缘的边界。错误函数可以在Apache Commons中找到,网址为org.apache.commons.math3.special.Erf。我可能会建议这样的事情:
boolean edge = Math.abs(Erf.erf(Intensity2 - Intensity1)) > σ;
其中σ是边的阈值,介于 0 和 1 之间。如果为真,则有边缘,如果为假,则为较小的污点,可以忽略。