我怎么能转换轴坐标转换为像素坐标? 我有一组数据,其中包括消极和浮点值,我需要把所有的数据到图像。 但是像素坐标均为正整数。 如何解决负问题?
Answer 1:
你可以通过坐标的载体来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
Answer 2:
据我了解,你有一组代表一个椭圆形的点,你会直接绘制这些图像矩阵(不只是在屏幕上显示它们)内。
对于这一点,你可以使用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)
文章来源: Axis coordinates to pixel coordinates? (Matlab)