错误理解:java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!(JAVA编程:图像像素值处理)

#引述:
在使用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);//正确方式

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

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是席木木啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值