在java中以矩阵形式操纵彩色图像

时间:2014-02-13 19:01:12

标签: java eclipse swing raster

我正在开发一个与使用JAVA进行彩色图像处理有关的项目。

我知道使用Raster类的getSample方法将彩色图像转换为矩阵,

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

我得到了像素[] []的矩阵(只有红色波段的值)。 然后我使用WritableRaster将矩阵转换回图像,

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

我使用

将其转换为图像

* BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); image.setData(光栅); *

但问题是,

1)我希望彩色图像按原样显示,而我只得到一个特定的带(只有红色,只有蓝色......),因为我必须根据方法setSample的原型指定一个带。得到enter code here样品。

2)如何获得表示彩色图像的2d矩阵(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; } }

1 个答案:

答案 0 :(得分: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