【问题标题】:how to make correct histogram using existing pixel of image?如何使用图像的现有像素制作正确的直方图?
【发布时间】:2012-04-11 10:10:28
【问题描述】:

我使用 java swing 在 netbeans 平台上制作 App。我创建特定图像的直方图。但它与 ImageJ 软件中该图像的直方图并不完全相同。那么,我怎样才能获得正确的直方图,或者有人可以向我建议我使用哪种方法来获取图像的精确像素并绘制直方图?

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FinalHistogram extends JPanel {

    int[] bins = new int[256];

    FinalHistogram(int[] pbins) {
        bins = pbins;
        repaint();
}

@Override
protected void paintComponent(Graphics g) {

        for (int i = 0; i < 256; i++) {

            System.out.println("bin[" + i + "]===" + bins[i]);
            g.drawLine(200 + i, 300, 200 + i, 300 - (bins[i]) / 70);
        }

}

public static void main(String[] args) throws IOException {
        JFrame frame = new JFrame();
        frame.setSize(500, 500);
        int[] pbins = new int[256];
        int[] sbins = new int[256];

        PlanarImage image = JAI.create("fileload", "C:\\aimages\\11309.jpg");

        BufferedImage bi = image.getAsBufferedImage();
        System.out.println("tipe is          " + bi.getType());
        int[] pixel = new int[3];

        int k = 0;
        Color c = new Color(k);
        Double d = 0.0;
        Double d1;
        for (int x = 0; x < bi.getWidth(); x++) {
            for (int y = 0; y < bi.getHeight(); y++) {
                pixel = bi.getRaster().getPixel(x, y, new int[3]);
                k = (int) ((pixel[0]) + ( pixel[1]) + (pixel[2]));
                k=k/3;
                sbins[k]++;

            }

        }
        System.out.println("copleted" + d + "--" + k);
        frame.add(new FinalHistogram(sbins));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

【问题讨论】:

  • 没有人可以帮助您修复您的代码而不看它。

标签: java image-processing histogram


【解决方案1】:

用于创建直方图的黑白图像的伪代码:

lookup_table[256]  //integers. 

for i in 256 do
  lookup_table[i] = 0

for i in image.size
    lookup_table[ pixel.value ] = lookup_table[ pixel.value ] + 1;

通常要可视化直方图,您必须使用一种称为“分箱”的技术,因为在大图像中,您有很多带有灰色阴影的像素,并且 1:1 表示无法在您的屏幕上显示。

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 2015-04-13
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多