java – 显示图像数据的直方图

前端之家收集整理的这篇文章主要介绍了java – 显示图像数据的直方图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有时需要显示 image data in the form of a histogram的表示.我对访问图像数据的方式特别感兴趣.我熟悉JFreeChart,其中包括直方图支持,但我会考虑其他方法.

解决方法

下面的示例使用几种技术来创建任意图像的RGB直方图:

> Raster方法getSamples()从BufferedImage中提取每个色带的值.
> HistogramDataset方法addSeries()将每个波段的计数添加到数据集.
> A StandardXYBarPainter替换ChartFactory默认值,如here所示.
>定制DefaultDrawingSupplier提供每个系列所需的颜色;它包含半透明的颜色.
> here的变形here用于控制每个频带的可见度;使用ChartMouseListener的补充方法here所示.

  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.EventQueue;
  4. import java.awt.Paint;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.image.BufferedImage;
  7. import java.awt.image.Raster;
  8. import java.io.IOException;
  9. import java.net.URL;
  10. import javax.imageio.ImageIO;
  11. import javax.swing.AbstractAction;
  12. import javax.swing.ImageIcon;
  13. import javax.swing.JCheckBox;
  14. import javax.swing.JFrame;
  15. import javax.swing.JLabel;
  16. import javax.swing.JPanel;
  17. import org.jfree.chart.ChartFactory;
  18. import org.jfree.chart.ChartPanel;
  19. import org.jfree.chart.JFreeChart;
  20. import org.jfree.chart.plot.DefaultDrawingSupplier;
  21. import org.jfree.chart.plot.PlotOrientation;
  22. import org.jfree.chart.plot.XYPlot;
  23. import org.jfree.chart.renderer.xy.StandardXYBarPainter;
  24. import org.jfree.chart.renderer.xy.XYBarRenderer;
  25. import org.jfree.data.statistics.HistogramDataset;
  26.  
  27. /**
  28. * @see https://stackoverflow.com/q/40537278/230513
  29. * @see https://stackoverflow.com/q/11870416/230513
  30. * @see https://stackoverflow.com/a/28519356/230513
  31. */
  32. public class Histogram {
  33.  
  34. private static final int BINS = 256;
  35. private final BufferedImage image = getImage();
  36. private HistogramDataset dataset;
  37. private XYBarRenderer renderer;
  38.  
  39. private BufferedImage getImage() {
  40. try {
  41. return ImageIO.read(new URL(
  42. "http://i.imgur.com/kxXhIH1.jpg"));
  43. } catch (IOException e) {
  44. e.printStackTrace(System.err);
  45. }
  46. return null;
  47. }
  48.  
  49. private ChartPanel createChartPanel() {
  50. // dataset
  51. dataset = new HistogramDataset();
  52. Raster raster = image.getRaster();
  53. final int w = image.getWidth();
  54. final int h = image.getHeight();
  55. double[] r = new double[w * h];
  56. r = raster.getSamples(0,w,h,r);
  57. dataset.addSeries("Red",r,BINS);
  58. r = raster.getSamples(0,1,r);
  59. dataset.addSeries("Green",2,r);
  60. dataset.addSeries("Blue",BINS);
  61. // chart
  62. JFreeChart chart = ChartFactory.createHistogram("Histogram","Value","Count",dataset,PlotOrientation.VERTICAL,true,false);
  63. XYPlot plot = (XYPlot) chart.getPlot();
  64. renderer = (XYBarRenderer) plot.getRenderer();
  65. renderer.setBarPainter(new StandardXYBarPainter());
  66. // translucent red,green & blue
  67. Paint[] paintArray = {
  68. new Color(0x80ff0000,true),new Color(0x8000ff00,new Color(0x800000ff,true)
  69. };
  70. plot.setDrawingSupplier(new DefaultDrawingSupplier(
  71. paintArray,DefaultDrawingSupplier.DEFAULT_FILL_PAINT_SEQUENCE,DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE));
  72. ChartPanel panel = new ChartPanel(chart);
  73. panel.setMouseWheelEnabled(true);
  74. return panel;
  75. }
  76.  
  77. private JPanel createControlPanel() {
  78. JPanel panel = new JPanel();
  79. panel.add(new JCheckBox(new VisibleAction(0)));
  80. panel.add(new JCheckBox(new VisibleAction(1)));
  81. panel.add(new JCheckBox(new VisibleAction(2)));
  82. return panel;
  83. }
  84.  
  85. private class VisibleAction extends AbstractAction {
  86.  
  87. private final int i;
  88.  
  89. public VisibleAction(int i) {
  90. this.i = i;
  91. this.putValue(NAME,(String) dataset.getSeriesKey(i));
  92. this.putValue(SELECTED_KEY,true);
  93. renderer.setSeriesVisible(i,true);
  94. }
  95.  
  96. @Override
  97. public void actionPerformed(ActionEvent e) {
  98. renderer.setSeriesVisible(i,!renderer.getSeriesVisible(i));
  99. }
  100. }
  101.  
  102. private void display() {
  103. JFrame f = new JFrame("Histogram");
  104. f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  105. f.add(createChartPanel());
  106. f.add(createControlPanel(),BorderLayout.SOUTH);
  107. f.add(new JLabel(new ImageIcon(image)),BorderLayout.WEST);
  108. f.pack();
  109. f.setLocationRelativeTo(null);
  110. f.setVisible(true);
  111. }
  112.  
  113. public static void main(String[] args) {
  114. EventQueue.invokeLater(() -> {
  115. new Histogram().display();
  116. });
  117. }
  118. }

猜你在找的Java相关文章