#引述:
在使用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("图像读取失败");
        }

毫无悬念,运行后出现以下报错信息:

java 像素膨胀 java像素类_图像处理


二、下面对这个常见错误信息“数组下标越界”进行解释:

(1)System.out.println(this.image.getHeight()+" "+this.image.getWidth());//打印图像像素矩阵宽度和高度 此代码块对应输出信息为:1920 1080

(2)再来查看原图像的信息:

java 像素膨胀 java像素类_java_02


看到这里,我开始觉得不对劲了,并且推断出:

//位深度为24,标准的三波段RGB图像
//这里的输出值的含义,图像的高度:1920px;图像宽度:1080px

(3)那么这里的报错根源在哪里呢?我们点击getRGB()后面的错误信息,可以看到对应的参数描述信息:

java 像素膨胀 java像素类_java 像素膨胀_03

这里的意思大致为:
//参数X坐标:是来自RGB或者sRGB彩色空间对应的像素值
//参数Y坐标:是来自RGB或者sRGB彩色空间对应的像素值

那么,现在问题的关键就转化成了:图像的空间坐标是如何定义的呢?

java 像素膨胀 java像素类_java 像素膨胀_04


(图片来自:冈萨雷斯和伍兹所著的《数字图像处理》第二版)

通过这张图片,我们可以得到的如下一个重要的对应关系:

heigh(图像高度)对应图像空间里面的X;
width(图像高度)对应图像空间里面的Y。

由此,我们可以得知,这里程序报错的原因是:
由于对图像空间坐标的误解,导致将getRGB(x,y)方法中的参数输入错误了,
因此:只需将参数调换即可,如下:

this.RGB_value=this.image.getRGB(width,height);//正确方式

于是,修改之后再次运行就正确了。