Координати на осите към пикселни координати? (Matlab)

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


person Elsie    schedule 11.10.2011    source източник
comment
Какъв вид сюжет трябва да генерирате? Scatter, линия и т.н. Също така, в каква форма са вашите данни? 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-файлове от File Exchange, които вече са много близо до това, от което се нуждаете.

И накрая, ето един лесен начин да получите това, което искате, с определена точност:

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 от предишен въпрос тук на SO:

%# 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_screenellipse_drawn_on_image

Това би трябвало да ви даде превъзходни резултати спрямо простото закръгляне на координатите на 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