Java 直方图均衡化 - 无法从图像栅格中获取像素

标签 java image image-processing histogram normalization

我一直在研究直方图均衡化方法。我用过 this question作为建立的基础。但是,我无法运行此代码,而且 Google 也无法帮助我找到问题。我传入一个 JPG BufferedImage 对象。我首先显示图像,这样我就可以看到正在处理的内容,然后再对其进行处理。但是它总是在 int valueBefore=img.getRaster().getPixel(x, y,iarray)[0]; 行失败,我不确定为什么。我得到的错误是 Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException: 1 但我看不出 为什么 它给出了这个错误,图片在那里并且充满了像素!

public BufferedImage hisrogramNormatlisation(BufferedImage img) {
        // To view image we're working on
        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(new JLabel(new ImageIcon(img)));
        frame.pack();
        frame.setVisible(true);

        int width =img.getWidth();
        int height =img.getHeight();
        int anzpixel= width*height;
        int[] histogram = new int[255];
        int[] iarray = new int[1];
        int i =0;

        // Create histogram
        for (int x = 50; x < width; x++) {
            for (int y = 50; y < height; y++) {
                int valueBefore=img.getRaster().getPixel(x, y,iarray)[0];
                histogram[valueBefore]++;
                System.out.println("here");
            }
        }

         int sum = 0;

         float[] lut = new float[anzpixel];
         for ( i=0; i < 255; ++i )
         {
             sum += histogram[i];
             lut[i] = sum * 255 / anzpixel;
         }

         i=0;
         for (int x = 1; x < width; x++) {
             for (int y = 1; y < height; y++) {
                 int valueBefore=img.getRaster().getPixel(x, y,iarray)[0];
                 int valueAfter= (int) lut[valueBefore];
                 iarray[0]=valueAfter;
                  img.getRaster().setPixel(x, y, iarray); 
                  i=i+1;
             }
         }
         return img;
    }

错误描述:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at java.awt.image.ComponentSampleModel.getPixel(ComponentSampleModel.java:n)
    at java.awt.image.Raster.getPixel(Raster.java:n)
    at MainApp.hisrogramNormatlisation(MainApp.java: * line described *)
    at MainApp.picture(MainApp.java:n)
    at MainApp.<init>(Main.java:n)
    at MainApp.main(Main.java:n)

最佳答案

您发布的堆栈跟踪显示您的超出范围索引为 1。 异常不会在您认为的地方抛出。 getPixel(int x, int y, int[] iarray) 用像素的强度值填充 iarray。如果您使用的是 rgb 图像,每个 channel 将至少有三个强度值,如果您使用的是带 alpha 的 rgb,则将有 4 个强度值。您的 iarray 的大小仅为 1,因此当 raster 想要访问更多元素以存储附加值时,将抛出 IndexOutOfBoundsException。 增加 iarray 的大小,异常就会消失。

关于Java 直方图均衡化 - 无法从图像栅格中获取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36603380/

相关文章:

java - 段落之间的图像使用 iText

java - JVM 类加载器无法从扩展类路径加载自定义 jar

java - 有没有办法让我的拼写检查器正常工作

java - Hibernate:保存多个关联问题

css - float Div 导致裁剪子 div/图像溢出

C# TabPage ImageKey 不绘图

java - 如何处理内容提供​​程序内的 SQLiteConstraintException

python - cv2 轮廓无法检测到某些形状

algorithm - 如何计算图像适合其容器的最佳比例?

image-processing - 平均图像滤波器