How can I find RGB values of a matrix of coordinates of an image?

Asked by Eric Martz

Eric Martz (view profile)

on 22 Jul 2019
Latest activity Commented on by Walter Roberson

Walter Roberson (view profile)

on 23 Jul 2019
Accepted Answer by Image Analyst

Image Analyst (view profile)

Hi,
I'm trying to pull the RGB values from a list of (x,y) coordinates that are centers of circles. My plan was to get the matrix of each component (r, g, and b) this way:
P = imread('image'); ...
x = centers(:, 1);
y = centers(:, 2);
rcenters = P(round(x), round(y), 1);
x is a 668 x 1 matrix, and so is y, so I was hoping rcenters would be 668 x 2, but instead it's 668 x 668, which does not make sense to me. I had to round the x and y coordinates to the nearest integer so that it would have integer indices.
How could I get it to return a 668 x 2 matrix with the R value of the x coordinate in column 1 and the R value of the y coordinate in column 2?

Tags

Answer by Image Analyst

Image Analyst (view profile)

on 22 Jul 2019

(x,y) is NOT (row, column) -- it's (column, row). You've made a very common beginner mistake. Put y first -- P(y, x)
x = round(centers(:, 1));
y = round(centers(:, 2));
rgbValues = zeros(length(x), 3)
counter = 1;
for col = 1 : length(y)
for row = 1 : length(x)
rgbValues(counter, :) = P(y(row), x(col), :);
counter = counter + 1;
end
end

Eric Martz

Eric Martz (view profile)

on 22 Jul 2019
Whoops, I even knew that and forgot to put y first, sorry.
So the matrix resulting from this gave a 446224 x 3 matrix. How could I extract the rgb value of each point (x,y) then?
Image Analyst

Image Analyst (view profile)

on 23 Jul 2019
Did you see this line in the code:
rgbValues(counter, :) = P(y(row), x(col), :);
That gives you the RGB values. Red is column1, green is col2 and blue is col3.
Eric Martz

Eric Martz (view profile)

on 23 Jul 2019
I figured it out. I edited the code to make this:
x = round(centers(:, 1));
y = round(centers(:, 2));
rgbValues = zeros(length(x), 3);
counter = 1;
for row = 1 : length(x)
rgbValues(counter, :) = P(round(centers(row, 2)), round(centers(row, 1)), :);
counter = counter + 1;
end
pts = [x, y];
rgb = horzcat(rgbValues, pts);
The issue with the code you provided was that it gave the rgb value of every possible combination of every x and y coordinate instead of just the x and y coordinates that went together.

Answer by Walter Roberson

Walter Roberson (view profile)

on 23 Jul 2019

rcenters = P( sub2ind(size(P), y, x, ones(size(y))) );

Answer by Akira Agata

Akira Agata (view profile)

on 23 Jul 2019

Another possible solution:
row = round(centers(:, 1));
col = round(centers(:, 2));
R = arrayfun(@(x,y) P(x,y,1),row,col);
G = arrayfun(@(x,y) P(x,y,2),row,col);
B = arrayfun(@(x,y) P(x,y,3),row,col);

Walter Roberson

Walter Roberson (view profile)

on 23 Jul 2019
Using x for row and y for column is confusing.