3

私は正確かつ短くしようとします。

ボリューム (128x128x128) とマスク ([0|1|2] の値で同じサイズ) があります。

3D ボリューム マトリックスを RGB の 3D イメージにし、マスクでマークされたポイントを各チャネル (赤、緑、青) に格納したいと考えています。

これは、その 3D キューブのスライスを取得して 2D 表現を使用することであり、物事をより高速にするために何度も計算するのではなく (私のプロジェクトでは非常に重要です)、実際には、3D ボリューム + RGB はストアのようなものです。 128 の 2D 画像用。

問題は、これをすべて行うにはどのような手順と方法が必要かということです: - ボリューム 128x128x128x3 を作成しますか? - 新しいカラーマップを定義します (オリジナルは灰色です) ? - 各チャンネルに参加しますか? - imagesc/whatever を使用して、その立方体の 1 つのスライスを、マスクでマークされている色のポイント (例: imageRGB(:,:,64)) で表示するにはどうすればよいですか?

それは私の推測ですが、適切に行う方法さえわかりません...少し迷っています。助けていただければ幸いです。これは間違っている可能性がありますが、あなたを助けるかもしれないコードです

% Create the matrix 4D
ovImg = zeros(size(volImg,1),size(volImg,2),size(volImg,3),3);    % 128x128x128x3
% Store in each channel the points marked as groups
ovImg(:,:,:,1) = volImg .* (mask==1);
ovImg(:,:,:,2) = volImg .* (mask==2);
ovImg(:,:,:,3) = volImg .* (mask==3);

大変感謝します!!

アップデート:

透明度とカラーマップに問題があります。これが私がやったことです。

% Create the matrix 4D
ovImg = zeros(size(volImg,1),size(volImg,2),size(volImg,3),3);
% Store in each channel the points marked as groups
ovImg(:,:,:,1) = imaNorm.*(mask==1);
ovImg(:,:,:,2) = imaNorm.*(mask==2);
ovImg(:,:,:,3) = imaNorm.*(mask==3);

[X,Y,Z] = meshgrid(1:128,1:128,1:128);
imaNorm = volImg - min(volImg(:));   
maxval = max(imaNorm(:));        
ovImg  = imaNorm + mask * maxval;


N= ceil(maxval);
c = [linspace(0,1,N)' zeros(N,2)];
my_colormap = [c(:,[1 2 3]) ; c(:,[3 1 2]) ; c(:,[2 3 1])];

figure;
imshow(squeeze(ovImg(:,:,64)),my_colormap);

figure;
imagesc(squeeze(mask(:,:,64)));

結果 (オーバーレイ画像/マスク) オーバーレイとマスク画像 何かアイデアはありますか? 改めまして、皆様


最終更新: Gunther Struyf が提案した別のアプローチで、まさに私が望んでいたものを手に入れることができました。ありがとうございます。本当に感謝しています。これが他の人にも役立つことを願っています。

4

1 に答える 1

2

imshowカラーマップと共に使用して、グレースケール イメージ (所有している) から RGB イメージを「偽造」することができます。スケールについては、それを乗算するのではなく、値にオフセットを追加するので、各マスクはカラーマップ内の異なる範囲になります。

3d マトリックスのスライスをプロットするには、インデックスを付けてからスクイーズして、結果のシングルトン次元を削除できます。

例:

[X,Y,Z]=meshgrid(1:128,1:128,1:128);
volImg =5*sin(X/3)+13*cos(Y/5)+8*sin(Z/10);
volImg=volImg-min(volImg(:));
mask = repmat(floor(linspace(0,3-2*eps,128))',[1 128 128]);

maxval=max(volImg(:));
ovImg=volImg+mask*maxval;
imshow(squeeze(ovImg(:,:,1)),jet(ceil(max(ovImg(:)))));

マスクされていない元の画像 ( imshow(squeeze(volImg(:,:,1)),jet(ceil(maxval))))

ここに画像の説明を入力

マスクの結果(上記のコードブロック):

ここに画像の説明を入力

さまざまなカラーマップについては、こちらを参照するか、独自のカラーマップを作成してください。たとえば、マスクには 3 つの値があるので、それらを R、G、B と一致させましょう。

N = ceil(maxval);
c = [linspace(0,1,N)' zeros(N,2)];
my_colormap = [c(:,[1 2 3]) ; c(:,[3 1 2]) ; c(:,[2 3 1])];
figure
imshow(squeeze(ovImg(:,:,1)),my_colormap);

与える:

ここに画像の説明を入力

他のアプローチ:

imshowから、変数を 0 から 1 の間の値に再スケーリングするだけで済みます。

色の濃さは 0.0 ~ 1.0 の範囲で指定できます。

以下を使用して実行できます。

minval=min(volImg(:));
maxval=max(volImg(:));
volImg=(volImg-minval)/(maxval-minval);

次はあなたのコードです:

ovImg = zeros([size(volImg),3]);
ovImg(:,:,:,1) = volImg .* (mask==1);
ovImg(:,:,:,2) = volImg .* (mask==2);
ovImg(:,:,:,3) = volImg .* (mask==3);

あなたは今それをプロットする必要があります:

imshow(squeeze(ovImg(:,:,64,:)))
于 2012-08-18T07:53:36.393 に答える