上一篇文章中,已经说过了图像的灰度化,灰度化之后,我们希望了解像素在0-255的分布情况。这就是我们下面要说的图像的灰度直方图,这是最简单的一种。但是原理都是一样的。图像的直方图有大量的用处,它反应了图像的某些特征,以至于可以用来进行图像搜索。
获得直方图信息代码如下:
public int[] hist(){
toGray();
int[] hist = new int[256];
int len = h*w;
for(int i=0;i<len;i++)
hist[data[i]]++;
return hist;
}
然后我们要做的就是画出图像的统计直方图,代码如下:
public BufferedImage getHist(){
toGray();
int[] intensity = hist();
int size = 300;
BufferedImage pic = new BufferedImage(size,size, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = pic.createGraphics();
g2d.setPaint(Color.BLACK);
g2d.fillRect(0, 0, size, size);
g2d.setPaint(Color.WHITE);
g2d.drawLine(5, 250, 265, 250);
g2d.drawLine(5, 250, 5, 5);
g2d.setPaint(Color.GREEN);
int max = math.findMaxValue(intensity); //找到直方图中最大的值
float rate = 200.0f/((float)max);
int offset = 2;
for(int i=0; i<intensity.length; i++) {
int frequency = (int)(intensity[i] * rate);
g2d.drawLine(5 + offset + i, 250, 5 + offset + i, 250-frequency);
}
g2d.setPaint(Color.RED);
g2d.drawString("", 100, 270);
return pic;
}
以上代码参考了 图像分析之直方图分析
运行结果如下: