2017-10-03 37 views
2

あまりあまり定義されていない方法で、カラー画像をグレースケールに変換したいと考えています。カラー画像をJavaのグレースケール画像に変換する

カラー画像を読み取るコードはここにある

主な方法:

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(); 
} 

別の方法:私はグレースケールに出力を変換する必要があり

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; 
} 

...ここで出力の一部です

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

RGBのすべてのピクセルをチェックしてグレースケールに変換する必要があります。

答えて

2

迅速かつ汚い方法は次のようになります

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); 

すべてのRGB成分が同じ値(例:240 240 240。)を含有する場合、グレーニュアンスが得られます。これを達成するには、カラーのRGBコンポーネントの平均数値表現が必要です。

さらに高度なアルゴリズムについては、tannerhelland.com/3643/grayscale-image-algorithm-vb6を確認してください。

関連する問題