#引述:
在使用java进行数字图像处理时,常常会遇到如下错误:
java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
起初,我坚信我的代码是没有问题的,但是经过再次了解图像像素的排列方式,即:图像空间坐标系之后…
#正文:
一、先来看一段用java来进行RGB图像像素值获取的代码:
try{
this.image=ImageIO.read(new File(this.image_path));//读取图像
this.image_info=this.image.getColorModel().toString();//获取图像色彩空间信息
this.width=this.image.getWidth();this.height=this.image.getHeight();//获取图像像素矩阵宽度和高度
System.out.println(this.image.getHeight()+" "+this.image.getWidth());//打印图像像素矩阵宽度和高度
//获取空间域像素值
for (int height=0;height<this.height;height++)
{
for (int width=0;width<this.width;width++)
{
**this.RGB_value=this.image.getRGB(height,width);//看这里的错误方式**
this.rgb_value[0]=(this.RGB_value&0xff0000)>>16;//Red
this.rgb_value[1]=(this.RGB_value&0xff00)>>8;//Green
this.rgb_value[2]=(this.RGB_value&0xff);//Blue
}
}
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("图像读取失败");
}
毫无悬念,运行后出现以下报错信息:
二、下面对这个常见错误信息“数组下标越界”进行解释:
(1)System.out.println(this.image.getHeight()+" "+this.image.getWidth());//打印图像像素矩阵宽度和高度
此代码块对应输出信息为:1920 1080
(2)再来查看原图像的信息:
看到这里,我开始觉得不对劲了,并且推断出:
//位深度为24,标准的三波段RGB图像
//这里的输出值的含义,图像的高度:1920px;图像宽度:1080px
(3)那么这里的报错根源在哪里呢?我们点击getRGB()后面的错误信息,可以看到对应的参数描述信息:
这里的意思大致为:
//参数X坐标:是来自RGB或者sRGB彩色空间对应的像素值
//参数Y坐标:是来自RGB或者sRGB彩色空间对应的像素值
那么,现在问题的关键就转化成了:图像的空间坐标是如何定义的呢?
(图片来自:冈萨雷斯和伍兹所著的《数字图像处理》第二版)
通过这张图片,我们可以得到的如下一个重要的对应关系:
heigh(图像高度)对应图像空间里面的X;
width(图像高度)对应图像空间里面的Y。
由此,我们可以得知,这里程序报错的原因是:
由于对图像空间坐标的误解,导致将getRGB(x,y)方法中的参数输入错误了,
因此:只需将参数调换即可,如下:
this.RGB_value=this.image.getRGB(width,height);//正确方式
于是,修改之后再次运行就正确了。