Как мога да преобразувам координатите на осите в координати на пиксели? Имам набор от данни, които включват отрицателни и плаващи стойности, трябва да поставя всички данни в изображението. Но координатите на пикселите са цяло положително число. как да разрешим негативния проблем?
Координати на осите към пикселни координати? (Matlab)
Отговори (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
x
и y
като индекси, трябва да добавим 1
, тъй като MATLAB индексира от 1
.
- 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)
Това би трябвало да ви даде превъзходни резултати спрямо простото закръгляне на координатите на 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)