2017-10-02 14 views
1

いくつかの高さデータを3Dビューにいくつかの輝度データでオーバーレイしたいと思います。 2Dでは簡単です(下のコードで生成される最初の画像を参照してください)が、3Dでは表現がやや奇妙に見えます。下の例の2番目と3番目の画像を参照してください。私はrgbイメージ内のドットがより「固い」ように見えます。Matlab:透明なテクスチャを使用して3Dサーフェスをオーバーレイする

figure; 
subplot(1,3,1); 
% Get some data 
[x,y,z] = peaks(128); 
pos = (rand(2,5).*4)-2; 
i = zeros(128,128); 
for n = 1:5 
    i = i+exp(-((((x-pos(1,n))/.2).^2+(((y-pos(2,n)))/.2).^2))); 
end 

% Convert to uin16 since real data is uint16 
i = i./max(i(:)); 
i = i * 2^16; 
i = uint16(i); 

i_rgb = ind2rgb(i, hot(2^16)); 

% Display data 

% This is how it should look like in 3D 

imagesc(z); 
colormap(gray); 
axis image; 
hold on; 

img = imshow(i_rgb); 
img.AlphaData = i; 

% now in 3D, here the texture looks strange 

subplot(1,3,2); 

s = surface(x,y,z); 
s.EdgeColor = 'none'; 
axis ij tight equal off; colormap(gray); 

hold on; 

s2 = surface(x,y,z); 
s2.EdgeColor = 'none'; 
s2.FaceColor = 'texturemap'; 
s2.CData = i_rgb; 
s2.FaceAlpha = 'texturemap'; 
s2.AlphaData = i; 
hold off; 

% Again in 3D, but without FaceAlpha = 'texturemap'; 
% The intensity-dots look good, but the remaining area looks strange. 
subplot(1,3,3); 

s3 = surface(x,y,z); 
s3.EdgeColor = 'none'; 
axis ij tight equal off; colormap(gray); 

s4 = surface(x,y,z); 
s4.EdgeColor = 'none'; 
s4.FaceColor = 'texturemap'; 
s4.CData = i_rgb; 
s2.AlphaData = i; 

left: looks fine, but 2D only. center: a lot of gaps in the intensity image. right: right: the surface underneath looks weird.

更新:システム情報:

OS:42.1

>> version 

ans = 

    '9.2.0.538062 (R2017a)' 

>> opengl info 
          Version: '4.5.0 NVIDIA 375.66' 
          Vendor: 'NVIDIA Corporation' 
         Renderer: 'Quadro K1000M/PCIe/SSE2' 
        MaxTextureSize: 16384 
          Visual: 'Visual 0x27, (RGBA 32 bits (8 8 8 8), Z depth 16 bits, Hardware acceleration, Double buffer, Antialias 8 samples)' 
         Software: 'false' 
      HardwareSupportLevel: 'full' 
     SupportsGraphicsSmoothing: 1 
    SupportsDepthPeelTransparency: 1 
     SupportsAlignVertexCenters: 1 
         Extensions: {330×1 cell} 
       MaxFrameBufferSize: 16384 
+0

(悪い)数字を再現できません。お使いのOS、matlabのバージョン、OpenGLのバージョンを指定できますか? OpenGLの問題かどうかを調べるには、 'opengl software'を使ってソフトウェアレンダリングに切り替えてみてください。 – m7913d

+0

システムデータをアップデートに追加しました。ソフトウェアレンダリングを使用すると、中央画像が少し見やすくなりますが、回転させるとまだギャップがあります。 –

+0

これは望ましい結果ですか:https://imgur.com/a/cFdxh?おそらく、 – m7913d

答えて

3

オーケーSUSE LINUX、Linuxでのレンダリングに問題があると思われますか、少なくとも私のOpenGLのバージョン。私のための問題を解決する回避策があります:代わりに、透明性とテクスチャを使用して、私はRGBイメージに高さと強度のデータを組み合わせて、テクスチャとしてこれを使用する:

figure; 

% Get some data 
[x,y,z] = peaks(128); 
pos = (rand(2,5).*4)-2; 
i = zeros(128,128); 
for n = 1:5 
    i = i+exp(-((((x-pos(1,n))/.2).^2+(((y-pos(2,n)))/.2).^2))); 
end 

% Convert to uin16 since real data is uint16 
i = i./max(i(:)); 
i = i * 2^16; 
i = uint16(i); 

% Do the same with the z-data 

z_idx = z - min(z(:)); 
z_idx = z_idx/max(z_idx(:)); 
z_idx = uint16(2^16 * z_idx); 

i_rgb = ind2rgb(i, hot(2^16)); 
z_rgb = ind2rgb(z_idx, gray(2^16)); 

% merge the images using i as alpha values. 

alphas = double(i)/2^16; 
alphas_inv = ones(size(alphas)) - alphas; 

% Display data 

merged_rgb = zeros(size(i,1), size(i,2), 3); 

for channel = 1:3 
    merged_rgb(:,:,channel) = z_rgb(:,:,channel).*alphas_inv + i_rgb(:,:,channel) .* alphas; 
end 

s = surface(x,y,z); 
s.EdgeColor = 'none'; 
s.FaceColor='texturemap'; 
s.CData = merged_rgb; 

これは期待どおりの結果が得られ enter image description here

関連する問題