2014-02-13 55 views
1

我正在使用JAVA處理與彩色圖像操作相關的項目。在java中以矩陣形式操作彩色圖像

我認識彩色圖像的成使用光柵類的方法的getSample的矩陣轉換,

像素[X] [Y] = raster.getSample(X,Y,0);

我得到矩陣像素[] [](只有紅色帶的值)。 然後我轉換的矩陣重新使用的WritableRaster作爲圖像,

raster.setSample(I,J,0,像素[i] [j]);

予使用,

* BufferedImage的圖像=新的BufferedImage(W,H,BufferedImage.TYPE_INT_RGB)它轉換爲圖像; image.setData(光柵); *

但問題是,

1)我要顯示彩色圖像,因爲它是,而我得到僅在特定頻段(如只能紅色,只藍色),因爲我必須按照方法setSample的原型指定一個樂隊,並獲得enter code here示例。

2)我怎樣才能代表彩色圖像(在3點不同的矩陣來表示所有3個波段)

下面的二維矩陣是我的代碼片段的幫助下網上寫的代碼...

import java.awt.Image; import java.awt.Point; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.io.File; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; class TestImage { ImageIcon icon; SampleModel sampleModel; public static void main(String args[]){ TestImage mamu = new TestImage(); File file = new File("photo.jpg"); mamu.compute(file); } public void compute(File file){ try{ BufferedImage img= ImageIO.read(file); Raster raster=img.getData(); sampleModel = raster.getSampleModel(); int w=raster.getWidth(),h=raster.getHeight(); int pixels[][]=new int[w][h]; for (int x=0;x<w;x++){ for(int y=0;y<h;y++){ pixels[x][y]=raster.getSample(x,y,0); } } Image image = getImage(pixels); JFrame frame = new JFrame("uff"); ImageIcon icon = new ImageIcon(image); JLabel label = new JLabel(icon); frame.setContentPane(label); frame.setVisible(true); frame.setSize(200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }catch (Exception e){ e.printStackTrace(); } } public java.awt.Image getImage(int pixels[][]){ int w=pixels.length; int h=pixels[0].length; WritableRaster raster= Raster.createWritableRaster(sampleModel, new Point(0,0)); for(int i=0;i<w;i++){ for(int j=0;j<h;j++){ raster.setSample(i,j,0,pixels[i][j]); } } BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); image.setData(raster); File output=new File("check.jpg"); try { ImageIO.write(image,"jpg",output); }catch (Exception e){ e.printStackTrace(); } return image; } }
+0

以何種形式,你所需要的像素?這可能是相當容易的,如果你可以使用像素作爲(1D)int []數組... – Marco13

+0

@ Marco13我正在研究一個圖像壓縮項目,爲此我需要三個不同波段的三個2d矩陣。在它的每一個,我應該應用壓縮算法,後來結合這三個矩陣,並形成一個圖像來顯示。 – Akash

+0

耶@馬可夫13,甚至可以達到目的 – Akash

回答

2

你可能會尋找或java.awt.image.LookupOp,它採用了java.awt.image.LookupTable修改帶整塊。引用了幾個例子here。下圖說明反轉:

short[] invert = new short[256]; 
for (int i = 0; i < 256; i++) { 
    invert[i] = (short) (255 - i); 
} 
BufferedImageOp invertOp = new LookupOp(new ShortLookupTable(0, invert), null)); 
invertOp.filter(src, dst); 

image