Координаты оси в координаты пикселей? (Матлаб)

Как я могу преобразовать координаты оси в координаты пикселей? У меня есть набор данных, который включает отрицательные и плавающие значения, мне нужно поместить все данные в изображение. Но все координаты пикселей — положительные целые числа. как решить отрицательный вопрос?


person Elsie    schedule 11.10.2011    source источник
comment
Какой сюжет вам нужно создать? Разброс, линия и т. д. Кроме того, в какой форме представлены ваши данные? векторы X и &, матрица Nx2 и т. д.   -  person reve_etrange    schedule 11.10.2011
comment
Наборы данных [X, Y] представляют собой координаты точек, которые могут составлять эллипс. Я могу построить эллипс, но на данный момент я сталкиваюсь с трудностями при вводе всех координат в изображение (координаты пикселей). m должен рисовать эллипс на изображении.   -  person Elsie    schedule 11.10.2011
comment
@Ivy: я опубликовал ответ на основе вашего комментария ..   -  person Amro    schedule 14.10.2011


Ответы (2)


Вы можете передавать векторы координат в scatter.

x = [-1.2 -2.4 0.3 7];
y = [2    -1   1  -3];
scatter(x,y,'.');

Если вам нужна матрица изображения,

h = figure();
scatter(x,y);
F = getframe(h);
img = F.cdata;

Вы также можете использовать print для сохранения графика в файл (или просто экспортировать из окна рисунка), а затем использовать imread для чтения файла.

Существует также этот набор m-файлов из файлового обмена, которые уже очень близки к тому, что вам нужно.

Наконец, вот простой способ получить то, что вы хотите, с заданной точностью:

precision = 10;        %# multiple of 10
mi = min(min(x),min(y));
x = x - mi;        %# subtract minimum to get rid of negative numbers
y = y - mi;
x = round(x*precision) + 1;    %# "move" decimal point, round to integer,
y = round(y*precision) + 1;    %# add 1 to index from 1
img = zeros(max(max(x),max(y)));    %# image will be square, doesn't have to be
x = uint32(x);
y = uint32(y);
ind = sub2ind(size(img),y,x);    %# use x,y or reverse arrays to flip image
img(ind) = 1;    %# could set intensity or RGB values in a loop instead

Параметр «точность» определяет, сколько десятичных разрядов в значениях с плавающей запятой будет сохранено, и, следовательно, разрешение и точность изображения. Приведение к uint32 может быть ненужным.

Если у вас есть Nx3 матрица значений RGB для каждой из N точек:

img = zeros(max(max(x),max(y)),max(max(x),max(y)),3);
for i=1:length(N)        %# N = length(x) = length(y)
    img(x(i),y(i),:) = rgb(i,:);
end
person reve_etrange    schedule 11.10.2011
comment
Большое спасибо. Думаю, ваш ресурс был бы мне очень полезен. - person Elsie; 11.10.2011
comment
Я проверил свой эллипс, используя приведенные выше коды. Но я не понимаю «округление (x * точность) + 1». Что делает этот код? Что такое «+1»? Это какая-то конверсия? - person Elsie; 11.10.2011
comment
После вычитания минимума новый минимум равен нулю. Как только мы будем готовы использовать x и y в качестве индексов, нам нужно добавить 1, так как MATLAB индексирует из 1. - person reve_etrange; 11.10.2011
comment
Я прокомментировал блок кода, надеюсь, он более понятен. Найдите-замените хеш-символы, если это необходимо. - person reve_etrange; 11.10.2011

Насколько я понимаю, у вас есть набор точек, представляющих эллипс, и вы должны рисовать их непосредственно внутри матрицы изображения (а не просто отображать их на экране).

Для этого вы можете использовать функцию POLY2MASK для преобразования эллипс в бинарную маску. Затем, вычислив его периметр, мы получим двоичный файл маска, представляющая только пиксели, составляющие эллипс, который применяется к изображению для установки цвета пикселей.

Рассмотрим пример ниже. Я использую функцию calculateEllipse.m из предыдущего вопроса. здесь на ТАК:

%# some image
I = imread('pout.tif');
sz = size(I);

%# ellipse we would like to draw directly on image matrix
[x,y] = calculateEllipse(100,50, 150,50, 30, 100);

%# lets show the image, and plot the ellipse (overlayed).
%# note how ellipse have floating point coordinates, 
%# and also have points outside the image boundary
figure, imshow(I)
hold on, plot(x,y, 'LineWidth',2)
axis([-50 250 -50 300]), axis on

%# create mask for image pixels inside the ellipse polygon
BW = poly2mask(x,y,sz(1),sz(2));

%# get the perimter of this mask
BW = bwperim(BW,8);

%# use the mask to index into image
II = I;
II(BW) = 255;
figure, imshow(II)

ellipse_drawn_on_screenэллипс_нарисованный_на_изображении

Это должно дать вам превосходные результаты по сравнению с простым округлением координат x и y (плюс для нас обрабатываются точки за пределами границ). Обязательно прочитайте раздел алгоритма POLY2MASK, чтобы увидеть, как он работает на уровне субпикселей.


РЕДАКТИРОВАТЬ:

если вы работаете с изображением RGB (3D-матрица), то же самое применимо, вам нужно только изменить последнюю часть, где мы используем бинарную маску:

%# color of the ellipse (red)
clr = [255 0 0];                %# assuming UINT8 image data type

%# use the mask to index into image
II = I;
z = false(size(BW));
II( cat(3,BW,z,z) ) = clr(1);   %# R channel
II( cat(3,z,BW,z) ) = clr(2);   %# G channel
II( cat(3,z,z,BW) ) = clr(3);   %# B channel
figure, imshow(II)

Вот еще один способ:

%# use the mask to index into image
II = I;
BW_ind = bsxfun(@plus, find(BW), prod(sz(1:2)).*(0:2));
II(BW_ind) = repmat(clr, [size(BW_ind,1) 1]);
figure, imshow(II)

pillsetc.png

person Amro    schedule 14.10.2011
comment
Как я могу изменить указанный выше «BW», чтобы контролировать цвет периметра маски, я намерен использовать значение RGB. - person Elsie; 20.10.2011
comment
@Ivy: это просто вопрос индексации, см. Мое редактирование выше (один использует логическую индексацию, другой — линейные индексы) - person Amro; 20.10.2011