2014-02-13 51 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