我使用ginput
从RGB图像中选择了一些像素。现在我需要一个代码来同时提取所有选定像素的RGB值,并将它们保存在像素的坐标矩阵中。有什么建议吗?
A=imread('AMAR.jpg');
imshow(A)
samp1= ginput(A)
samp1
是< 47x5 double>
一些结果是:
95 92 95 81 99 66 97 66 100 58 105 51 108 42 116 33
答案 0 :(得分:1)
假设您点击RGB图像中的N
点:
N=4;
imagesc(img)
[x,y]=ginput(N);
x
,y
值可用于查找每个位置的RGB矢量:
x = round(x(:)); y = round(y(:));
locs = sub2ind(size(img),repmat(y,3,1),repmat(x,3,1),kron(1:3,ones(1,N)).'); %'
RGBvals = reshape(img(locs),N,3)
这为每个点提供了N
- 3个RGB值数组。使用交互式工具impixelregion
可以直观地验证颜色值。
注意:请参阅here,了解kron
有关{{1}}的信息,希望能够解决有关其在此使用的任何谜团。
答案 1 :(得分:1)
@chappjc的答案会起作用;我想提供一个更具“可读性”的小改动:
首先 - 不带任何参数调用ginput
。它将保持累积点数,直到您点击“输入”。更加用户友好。
第二 - 有时间和地点进行矢量化。当你只有一些点(即每次点击一点)时,矢量化代码的加速不太可能值得sub2ind, repmat, kron...)
的痛苦。这给我们留下了以下内容:
imshow(A);
disp( 'Click points in the image; press return when finished' );
[xf, yf] = ginput;
xi = round(xf);
yi = round(yf);
N = numel(xi);
rgbValues = zeros(N, 3);
for ii = 1:numel(xi)
rgbValues(ii,:) = reshape(A(yi(ii), xi(ii), :), 1, 3);
end
这会将您想要的值放入rgbValues
。
检查,按照显示的顺序返回xi
和yi
的值;我认为这是对的,但是如果我错了,你必须在阅读图片时使用订单A(xi(ii), yi(ii), :)
。