有人可以在这里告诉我如何访问图像的所有像素,以便能够构建该图像的直方图吗?
答案 0 :(得分:4)
您可以使用
java.awt.image.BufferedImage image = ImageIO.read( "image.gif" );
int[] samples = image.getData().getPixel( x, y, null );
// or the pixel converted to the default RGB color model:
int rgb = image.getRGB( x, y )
我认为你从那里获得的samples
是RGB值,但你必须检查......
答案 1 :(得分:1)
如果您可以使用JAI,则可以选择生成Histograms。
答案 2 :(得分:1)
这里有一些可能有用的示例代码 - 请测试一下(它似乎适用于我,但你永远不会知道!)。
这个直方图在这里没有均衡或任何东西,只是按字面计算每个频段中特定值的像素。
我相信乐队(你需要检查)按顺序是R,G,B + Alpha。
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import javax.imageio.ImageIO;
public class SimpleImageReader {
public static void main(String[] args) throws Exception {
// File f=new File(args[0]);
File f=new File("C:\\1.jpg");
BufferedImage img = ImageIO.read(f);
Raster r=img.getData();
int levels=256;
int bands=r.getNumBands();
int histogram[][]=new int[bands][levels];
for (int x=r.getMinX();x<r.getWidth();x++) {
for (int y=r.getMinY();y<r.getHeight();y++) {
for (int b=0;b<3;b++) {
int p=r.getSample(x, y, b);
histogram[b][p]++;
}
}
}
for (int b=0;b<histogram.length;b++) {
System.out.println("Band:"+b);
for (int i=0;i<histogram[b].length;i++) {
System.out.println("\t"+i+"="+histogram[b][i]);
}
}
}
}