Я создаю программу фильтра изображений, и я хочу преобразовать цветное изображение в полутоновый снимок с помощью матрицы массивов.Преобразование изображения в оттенки серого с матрицей массива RGB java
Это то, что я в настоящее время:
import java.awt.Color;
import se.lth.cs.ptdc.images.ImageFilter;
public class GrayScaleFilter extends ImageFilter {
public GrayScaleFilter(String name){
super(name);
}
public Color[][] apply(Color[][] inPixels, double paramValue){
int height = inPixels.length;
int width = inPixels[0].length;
Color[][] outPixels = new Color[height][width];
for (int i = 0; i < 256; i++) {
grayLevels[i] = new Color(i, i, i);
}
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color pixel = inPixels[i][j];
outPixels[i][j] = grayLevels[index];
}
}
return outPixels;
}
}
Похоже, я должен использовать эту формулу: ((R + G + B)/3)
Я хочу создать матричный так:
Color[] grayLevels = new Color[256];
// creates the color (0,0,0) and puts it in grayLevels[0],
// (1,1,1) in grayLevels[1], ..., (255,255,255) in grayLevels[255]
Это класс я ссылаюсь тоже, когда я хочу использовать grascale:
public abstract Color[][] apply(Color[][] inPixels, double paramValue);
protected short[][] computeIntensity(Color[][] pixels) {
int height = pixels.length;
int width = pixels[0].length;
short[][] intensity = new short[height][width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
Color c = pixels[i][j];
intensity[i][j] = (short) ((c.getRed() + c.getGreen() + c
.getBlue())/3);
}
}
return intensity;
}
Любые отзывы о том, как я могу это достичь? Вместо того чтобы использовать outPixels[i][j] = new Color(intensity, intensity, intensity);
Я добавил цикл и написал: outPixels [i] [j] = новый цвет (grayLevels [index]); Но он, похоже, не работает – Rob
Он должен быть outPixels = grayLevels [index]. Я предполагаю, что цель состоит в том, что вы не создаете много объектов Color. –
Вам также нужен код, который фактически построит BufferedImage и сохранит его на диске? –