【问题标题】:index out of bounds error in MATLABMATLAB中的索引越界错误
【发布时间】:2013-11-04 11:22:18
【问题描述】:

我正在尝试获取用户选择的图像像素的 RGB 值,但随后出现了超出范围的错误。这是代码:

x = int16(zeros(10,1));
y = int16(zeros(10,1));

imshow(img);
[x,y] = ginput; 
disp(['x = ' num2str(x)]);
disp(['y= ' num2str(y)]);
r = img(x,y,1);
g = img(x,y,2);
b = img(x,y,3);

这是我得到的错误(当用户选择像素 120,131 时):

试图访问 img(120,131,1); index 必须是正整数或逻辑整数。

为了停止出现这个错误,我将 x 和 y 声明为 int16,但错误仍然出现。然后我尝试手动输入像素的值,所以我做了这样的事情:

 r = img(229,104,1);

现在的错误是这样的:

试图访问 img(229,104,1);索引出 边界因为 size(img)=[217,331,3]。

如果像素不是真的越界,这怎么可能?代码有什么问题?

【问题讨论】:

    标签: matlab rgb pixel indexoutofboundsexception


    【解决方案1】:

    您将 X-Y 坐标与行列坐标混淆了。

    ginput 返回像素的 x ( = column ), y ( = row ) 坐标。
    访问矩阵img( ?, ?, : )时需要提供row(=y)、column(-x)坐标:

    >> img( y, x, 1 )
    

    【讨论】:

    • 您好,感谢您的回答,但仍然有 索引必须是正整数或逻辑。错误
    • @user2952272 看我的回答,我怀疑ginput 返回双精度数。
    【解决方案2】:

    除了 Shai 的回答之外,我还想知道对 ginput 的调用是否不会覆盖 xy 声明为 int16 的数据类型?如果我在 Octave 中做类似的事情,我会得到:

    >> [x,y]=ginput
    x =  79.798
    y =  72.042
    

    我建议:

    r = img(round(y),round(x),1);
    g = img(round(y),round(x),2);
    b = img(round(y),round(x),3);
    

    【讨论】:

    • 是的,它成功了!但正如你所问的,数据类型没有被覆盖,因为我输入的 disp 显示整数......有点奇怪,但我会使用你的建议。
    • 在调用numstr 时尝试使用precision 参数,我相信您会发现它们不是整数。您也可以使用whos检查数据类型。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2015-03-22
    • 2013-10-13
    • 2015-01-10
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多