Векторизованное решение, которое дает тот же результат, что и решение от Михаила , состоит в том, чтобы отсортировать все значения пикселей в вашем изображении с помощью функции SORT , преобразовать возвращенные линейные индексыиз SORT в индексы с подпиской, используя функцию IND2SUB , и соберите их вместе в один массив ячеек, используя функции ACCUMARRAY и MAT2CELL
A = randi([0 255],[5 5],'uint8'); %# A sample matrix
[values,indices] = sort(double(A(:))); %# Sort all the pixel values
[y,x] = ind2sub(size(A),indices); %# Convert linear index to subscript
counts = accumarray(values+1,1,[256 1]); %# Count number of each value
map = mat2cell([y x],counts); %# Create a 256-by-1 cell array
Теперь для заданного целого значения iValue
вы можете получить матрицу N
-by-2, содержащую координаты y
(первый столбец) и x
(второй столбец) дляN
пикселей на изображении с этим значением, выполнив следующие действия:
key = double(iValue)+1; %# Need to use double to avoid integer saturation
points = map{key}; %# An N-by-2 coordinate matrix
Кроме того, на случай, если вам интересно, вы также можете сделать map
структурным массивом с полями * 1025.* и y
с помощью функции STRUCT :
map = struct('x',mat2cell(x,counts),'y',mat2cell(y,counts));
И затем вы можете получить доступ к x
и y
координатам для пикселей со значением iValue
следующим образом:
key = double(iValue)+1;
x = map(key).x;
y = map(key).y