当前位置: 首页 > 知识库问答 >
问题:

显示图像数据的直方图

颛孙飞
2023-03-14

我有时需要以直方图的形式显示图像数据的表示。我对访问图像数据的方法特别感兴趣。我熟悉JFreeChart,其中包括直方图支持,但我会考虑其他方法。

共有1个答案

靳金鹏
2023-03-14

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

>

  • raster方法getsamples()bufferedimage提取每个颜色带的值。

    histogramdataset方法addseries()将每个频带的计数添加到dataset中。

    StandardXyBarPainter替换ChartFactory默认值,如下所示。

    自定义DefaultDrawingSupplier提供每个系列所需的颜色;它包含半透明的颜色。

    这里讨论的VisibleAction的一个变体用于控制每个波段的可见性;这里给出了使用ChartmouseListener的补充方法。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Paint;
    import java.awt.event.ActionEvent;
    import java.awt.image.BufferedImage;
    import java.awt.image.Raster;
    import java.io.IOException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.AbstractAction;
    import javax.swing.ImageIcon;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.DefaultDrawingSupplier;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYBarPainter;
    import org.jfree.chart.renderer.xy.XYBarRenderer;
    import org.jfree.data.statistics.HistogramDataset;
    
    /**
     * @see https://stackoverflow.com/q/40537278/230513
     * @see https://stackoverflow.com/q/11870416/230513
     * @see https://stackoverflow.com/a/28519356/230513
     */
    public class Histogram {
    
        private static final int BINS = 256;
        private final BufferedImage image = getImage();
        private HistogramDataset dataset;
        private XYBarRenderer renderer;
    
        private BufferedImage getImage() {
            try {
                return ImageIO.read(new URL(
                    "https://i.imgur.com/kxXhIH1.jpg"));
            } catch (IOException e) {
                e.printStackTrace(System.err);
            }
            return null;
        }
    
        private ChartPanel createChartPanel() {
            // dataset
            dataset = new HistogramDataset();
            Raster raster = image.getRaster();
            final int w = image.getWidth();
            final int h = image.getHeight();
            double[] r = new double[w * h];
            r = raster.getSamples(0, 0, w, h, 0, r);
            dataset.addSeries("Red", r, BINS);
            r = raster.getSamples(0, 0, w, h, 1, r);
            dataset.addSeries("Green", r, BINS);
            r = raster.getSamples(0, 0, w, h, 2, r);
            dataset.addSeries("Blue", r, BINS);
            // chart
            JFreeChart chart = ChartFactory.createHistogram("Histogram", "Value",
                "Count", dataset, PlotOrientation.VERTICAL, true, true, false);
            XYPlot plot = (XYPlot) chart.getPlot();
            renderer = (XYBarRenderer) plot.getRenderer();
            renderer.setBarPainter(new StandardXYBarPainter());
            // translucent red, green & blue
            Paint[] paintArray = {
                new Color(0x80ff0000, true),
                new Color(0x8000ff00, true),
                new Color(0x800000ff, true)
            };
            plot.setDrawingSupplier(new DefaultDrawingSupplier(
                paintArray,
                DefaultDrawingSupplier.DEFAULT_FILL_PAINT_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE));
            ChartPanel panel = new ChartPanel(chart);
            panel.setMouseWheelEnabled(true);
            return panel;
        }
    
        private JPanel createControlPanel() {
            JPanel panel = new JPanel();
            panel.add(new JCheckBox(new VisibleAction(0)));
            panel.add(new JCheckBox(new VisibleAction(1)));
            panel.add(new JCheckBox(new VisibleAction(2)));
            return panel;
        }
    
        private class VisibleAction extends AbstractAction {
    
            private final int i;
    
            public VisibleAction(int i) {
                this.i = i;
                this.putValue(NAME, (String) dataset.getSeriesKey(i));
                this.putValue(SELECTED_KEY, true);
                renderer.setSeriesVisible(i, true);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                renderer.setSeriesVisible(i, !renderer.getSeriesVisible(i));
            }
        }
    
        private void display() {
            JFrame f = new JFrame("Histogram");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(createChartPanel());
            f.add(createControlPanel(), BorderLayout.SOUTH);
            f.add(new JLabel(new ImageIcon(image)), BorderLayout.WEST);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                new Histogram().display();
            });
        }
    }
    

  •  类似资料:
    • 问题内容: 有时我需要以直方图的形式显示图像数据的表示形式。我对访问图像数据的方式特别感兴趣。我熟悉,其中包括直方图支持,但我会考虑其他方法。 问题答案: 下面的示例使用多种技术来创建任意图像的RGB直方图: 该方法从中提取每个色带的值BufferedImage。 该方法将每个频段的计数添加到。 一个替换默认,如图所示这里。 定制提供每个系列所需的颜色;它包含半透明的颜色。 一种变型,讨论在这里,

    • 问题内容: 此代码将图片test.gif放入图片位值中。 我的下一个目标是显示以字节为单位保存在数据库中的图片。如何才能做到这一点 ? 问题答案: 就像是: 可能为您工作。

    • 本文向大家介绍显示带有负值的MySQL直方图?,包括了显示带有负值的MySQL直方图?的使用技巧和注意事项,需要的朋友参考一下 对于负值,请使用reverse()以及concat()。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是对带有负值的直方图的查询- 这将产生以下输出-

    • 我想在我的应用程序中显示来自sqlite数据库的图像。我的要求是显示文本视图及其相关图像。我将我的数据库文件保存在资产文件夹中。但实际上我的图像存储在服务器的“allimages”文件夹中。 我的数据库列(我保留的assets文件夹中的db)如下所示: S.无描述 1 div style=“文本对齐:对齐;” 2 div style="文本对齐:对齐;" 现在我的问题是在我的数据库中,图像路径存储

    • 问题内容: 有没有一种方法可以指定MySQL中的bin大小?现在,我正在尝试以下SQL查询: 生成的数据足够好,但是行太多。我需要的是一种将数据分组到预定义的bin中的方法。我可以从脚本语言执行此操作,但是有没有办法直接在SQL中执行此操作? 例: 我在寻找什么: 我猜想这不能直接实现,但是对任何相关存储过程的引用也可以。 问题答案: 这是一篇有关在MySQL中为数值创建直方图的超级快捷方法的文章

    • 所以我猜没有注册的ImageReader?我怎么能通过Jaspersoft Studio修复这样的东西? 编辑:我尝试使用java.io.InputStream作为这里建议的类类型,但结果是相同的错误。算是吧。一个很大的区别是,在Jaspersoft Studio中,如果出现错误,您可以将图像设置为显示为空白。如果我使用java.awt.Image,那么这个设置什么也不做。我仍然得到一个错误,报告