2017-10-03 3 views
2

Je souhaite convertir une image colorée en échelle de gris sans trop de méthodes prédéfinies.Conversion d'une image colorée en image en niveaux de gris en Java

le code de lecture de l'image colorée est ici

La principale méthode:

BufferedImage img = null; 
try { 
    img = ImageIO.read(new File(IMG)); 

    int[][] pixelData = new int[img.getHeight() * img.getWidth()][3]; 
    int[] rgb; 

    int counter = 0; 
    for (int i = 0; i < img.getWidth(); i++) { 
     for (int j = 0; j < img.getHeight(); j++) { 
      rgb = getPixelData(img, i, j); 

      for (int k = 0; k < rgb.length; k++) { 
       pixelData[counter][k] = rgb[k]; 
      } 
      counter++; 
     } 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Une autre méthode:

private static int[] getPixelData(BufferedImage img, int x, int y) { 
    int argb = img.getRGB(x, y); 
    int rgb[] = new int[] { 
     (argb >> 16) & 0xff, //red 
     (argb >> 8) & 0xff, //green 
     (argb  ) & 0xff //blue 
    }; 

    System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]); 
    return rgb; 
} 

je dois convertir la sortie en niveaux de gris ... Ici est une partie de la sortie

rgb: 255 255 255 
rgb: 255 255 255 
rgb: 255 255 255 
rgb: 255 255 255 
rgb: 255 255 255 
rgb: 255 255 255 

Je dois vérifier chaque pixel pour qu'il soit RVB et le convertir en niveaux de gris.

Répondre

2

méthode rapide et sale serait:

int avg = ((rgb[0] + rgb[1] + rgb[2])/3); 

    int grey_rgb = 0; 
    for(int i = 0; i < 4; i++) { 
     grey_rgb <<= 8; 
     grey_rgb |= avg & 0xFF; 
    } 

    img.setRGB(x, y, grey_rgb); 

On obtient une nuance gris lorsque toutes ses composantes RVB contiennent la même valeur (ex 240 240 240.). Pour ce faire, nous avons simplement besoin d'une représentation numérique moyenne des composantes RVB de la couleur.

Pour des algorithmes plus avancés, veuillez vérifier ceci: tannerhelland.com/3643/grayscale-image-algorithm-vb6.