Java 基本パッケージには画像クラスが用意されており、一般的に使用されるクラスには java.awt.image.BufferedImage、javax.imageio.ImageIO などが含まれます。実際には、これら 2 つのクラスで十分です。前者は画像に対する基本的な操作について、後者は画像の読み取りについて説明します。
画像の読み込み:
BufferedImage img = null; try{ img = ImageIO.read(new FileInputStream("/home/eple/DIP/o.jpg")); }catch (IOException e) { //e.printStackTrace(); }
私はubuntuで実行しているため、ファイルパスはWindowsのものとは少し異なります。
コードの汎用性を高めるために、新しい画像処理クラス Imgae を作成しました。
public class Image{ public int h; //高 public int w; //宽 public int[] data; //像素 public boolean gray; //是否为灰度图像 public Image(BufferedImage img){ this.h = img.getHeight(); this.w = img.getWidth(); this.data = img.getRGB(0, 0, w, h, null, 0, w); this.gray = false; toGray(); //灰度化 } public Image(BufferedImage img,int gray){ this.h = img.getHeight(); this.w = img.getWidth(); this.data = img.getRGB(0, 0, w, h, null, 0, w); this.gray = false; } public Image(int[] data,int h,int w){ this.data = (data == null) ? new int[w*h]:data; this.h = h; this.w = w; this.gray = false; } public Image(int h,int w){ this(null,h,w); } public BufferedImage toImage(){ BufferedImage image = new BufferedImage(this.w, this.h, BufferedImage.TYPE_INT_ARGB); int[] d= new int[w*h]; for(int i=0;i<this.h;i++){ for(int j=0;j<this.w;j++){ if(this.gray){ d[j+i*this.w] = (255<<24)|(data[j+i*this.w]<<16)|(data[j+i*this.w]<<8)|(data[j+i*this.w]); }else{ d[j+i*this.w] = data[j+i*this.w]; } } } image.setRGB( 0, 0, w, h, d, 0, w ); return image; } }
この方法では、Java 自体が提供するメソッドに依存する必要はなく、画像を定義したクラスに変換するだけで済みます。たとえば、Android の場合、ピクセルの読み取りと存続は次のようになり、該当する関数を置き換えるだけです。
//android 中的获取方式RGB分量 pixelsA = Color.alpha(color); pixelsR = Color.red(color); pixelsG = Color.green(color); pixelsB = Color.blue(color); // 根据新的RGB生成新像素 newPixels[i] = Color.argb(pixelsA, pixelsR, pixelsG, pixelsB);
さて、上記のクラスには、画像のピクセル情報を読み取り、それを int 配列として保存し、int 配列を Bufferedmage に再変換するメソッドが含まれています。次に、画像を脱色する方法、つまりグレースケールについて説明します。
前の記事で述べたように、画像処理の事実に関しては、画像の明るさの情報、つまりグレースケールに関心があります。カラー画像をグレースケール画像に変換するにはどうすればよいでしょうか。とても簡単で、R、G、Bの3つの値を同じにするだけです。では、この値と R、G、B の元の値との間にはどのような関係があるのでしょうか?
一般に、Gray=R×0.299+G×0.587+B×0.114という経験式があるか、単にそれらの平均値を直接取得します。前述の経験式は、人間の目の観察とより一致しています。グレースケール関数は次のとおりです:
public void toGray(){ if(!gray){ this.gray = true; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int c = this.data[x + y * w]; int R = (c >> 16) & 0xFF; int G = (c >> 8) & 0xFF; int B = (c >> 0) & 0xFF; this.data[x + y * w] = (int)(0.3f*R + 0.59f*G + 0.11f*B); //to gray } } } }
処理効果は次のとおりです:
上記は、画像のグレースケール コンテンツと画像を表示する Java ローディング画像です。その他の関連コンテンツについては、こちらをご覧ください。 PHP 中国語 Web サイト (m.sbmmt.com) に注意してください。