2012-11-21 3 views
2

Я создаю программу фильтра изображений, и я хочу преобразовать цветное изображение в полутоновый снимок с помощью матрицы массивов.Преобразование изображения в оттенки серого с матрицей массива 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);

ответ

2

Постройте grayLevels массиву так:

for (int i = 0; i < 256; i++) { 
    grayLevels[i] = new Color(i, i, i); 
} 

Затем, когда вам нужен определенный цвет, просто получить его как grayLevels[index].

+0

Я добавил цикл и написал: outPixels [i] [j] = новый цвет (grayLevels [index]); Но он, похоже, не работает – Rob

+0

Он должен быть outPixels = grayLevels [index]. Я предполагаю, что цель состоит в том, что вы не создаете много объектов Color. –

+0

Вам также нужен код, который фактически построит BufferedImage и сохранит его на диске? –

Смежные вопросы