用java基礎包中,提供了圖像的類,我們常用到的有java.awt.image.BufferedImage,javax.imageio.ImageIO等等,事實上這兩個類就夠了。前一個有關影像的基本操作,後一個為讀取影像。
載入圖片:
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三個值相等即可。那麼這個值和原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 載入影像,顯示影像與影像的灰階化的內容,且有更多相關內容請注意PHPwww網(www. php.cn)!