找到&保存图像的某些选定像素的RGB值

时间:2014-02-11 20:41:22

标签: matlab image-processing rgb pixel

我使用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

2 个答案:

答案 0 :(得分:1)

假设您点击RGB图像中的N点:

N=4;
imagesc(img)
[x,y]=ginput(N);

xy值可用于查找每个位置的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

检查,按照显示的顺序返回xiyi的值;我认为这是对的,但是如果我错了,你必须在阅读图片时使用订单A(xi(ii), yi(ii), :)