2

我正在尝试获取用户选择的图像像素的 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]。

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

4

2 回答 2

2

您将 XY 坐标与行列坐标混淆了。

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

>> img( y, x, 1 )
于 2013-11-04T11:30:35.837 回答
0

除了 Shai 的回答,我还想知道调用ginput是否不会覆盖声明为int16forx和的数据类型y?如果我在 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);
于 2013-11-04T11:36:57.593 回答