軸座標をピクセル座標に変換するにはどうすればよいですか? 負の値と浮動小数点の値を含む一連のデータがあり、すべてのデータを画像に入れる必要があります。ただし、ピクセル座標はすべて正の整数です。ネガティブな問題を解決するには?
2 に答える
私が理解していることから、楕円を表す一連の点があり、それらを画像マトリックス内に直接描画する必要があります(画面に表示するだけではありません)。
このために、POLY2MASK関数を使用して、楕円をバイナリ マスクに変換できます。次に、そのperimeterを計算することにより、楕円を構成するピクセルのみを表すバイナリ マスクが得られます。これは、ピクセルの色を設定するために画像に適用されます。
以下の例を考えてみましょう。SOに関する以前の質問の関数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)
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)
座標のベクトルを に渡すことができます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
してプロットをファイルに保存 (または単に Figure ウィンドウからエクスポート) し、 を使用imread
してファイルを読み取ることもできます。
File Exchange からの m-files のセットもあり、これらはすでに必要なものに非常に近いものです。
最後に、指定された精度内で必要なものを取得する簡単な方法を次に示します。
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