Java 直方图均衡化 - 无法从图像栅格中获取像素
Java Histogram Equalisation - Can't get Pixel from Image Raster
我一直在研究直方图均衡化方法。我使用 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 图像,每个通道将至少有三个强度值,如果您使用的是带 alpha 的 rgb,则将有 4 个强度值。您的 iarray 的大小仅为 1,因此当 raster 想要访问更多元素以存储附加值时,将抛出 IndexOutOfBoundsException。
增加iarray的大小,异常就会消失。
不要使用 getPixel(),而是使用 getSample()。
因此您的代码将是:final int valueBefore = img.getRaster().getSample(x, y, 0) ;
甚至 histogram[img.getRaster().getSample(x, y, 0)]++ ;
顺便说一句,您可能需要先检查图像类型以确定 channels/bands 的数量并对每个通道执行此过程。
我一直在研究直方图均衡化方法。我使用 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 图像,每个通道将至少有三个强度值,如果您使用的是带 alpha 的 rgb,则将有 4 个强度值。您的 iarray 的大小仅为 1,因此当 raster 想要访问更多元素以存储附加值时,将抛出 IndexOutOfBoundsException。 增加iarray的大小,异常就会消失。
不要使用 getPixel(),而是使用 getSample()。
因此您的代码将是:final int valueBefore = img.getRaster().getSample(x, y, 0) ;
甚至 histogram[img.getRaster().getSample(x, y, 0)]++ ;
顺便说一句,您可能需要先检查图像类型以确定 channels/bands 的数量并对每个通道执行此过程。