4

텍스처 맵이있는 서페이스를 그려보고 싶지만 조건이 "이상적인"것이 아닙니다.텍스처 맵을 사용하여 서페이스를 플롯하는 방법

먼저 내가 가진 것을 설명해주십시오.

나는 그리드에서 이미지 좌표 인 점들 (~ 7000)을 가지고있다. 이 포인트는 완벽한 사각형을 정의하지 않습니다.메슈른이 아니며입니다. 질문을 위해서, 우리는 9 점이 있다고 가정합시다. 그래서,

X=[310,270,330,430,410,400,480,500,520] 
Y=[300,400,500,300,400,500,300,400,500] 

enter image description here 우리가 그리드의 "구조"를 얻을 수 있습니다 말할 수 있습니다

size1=3; 
size2=3; 
points=zeros(size1,size2,2) 
X=[310,270,330; 
    430,410,400; 
    480,500,520] 
Y=[300,400,500; 
    300,400,500; 
    300,400,500] 
points(:,:,1)=X; 
points(:,:,2)=Y; 

을 그리고 지금 우리는 3 차원, Z가 있다고 할 수 있습니다 : 우리는 이미지를 가지고있는 ilustrate을 수 있습니다

편집 : 정보를 추가하는 것을 잊어 버렸습니다. 나는 이미지의 점들을 삼각형으로 연결하고 3D 서신을 얻는다. 그래서 표면에 표시 될 때 그들은 이미지의 X와 Y 좌표를 갖지 않는다. 주어진 데이터의 단순화를 위해 X = X/2 Y = Y라고 말할 수있다./3

는 그리고 우리는이 : 내가 원하는 것은 이미지 텍스처와 3D로 표면을 플롯하는 것입니다

points=zeros(size1,size2,3) 
Z=[300,330,340; 
    300,310,330; 
    290,300,300] 

surf(points(:,:,1)/2,points(:,:,2)/3,points(:,:,3)) 

enter image description here

. 각 요소에는 첫 번째 이미지에있는 텍스처 조각이 있어야합니다.

거대한 데이터 시트에서 작동해야합니다. 특별히 빠른 것이 필요하지 않습니다.

관련 포스트 (하지만 난 점의 초기 설정으로 meshgrid있다) : Texture map for a 2D grid

PD : 내가 필요한 경우 내가 그것을 작은으로 쉽게 생각하기 때문에 + 실제 데이터, 그냥이 게시 원본 이미지를 게시 할 수 있습니다 데이터.

답변

4

나는 당신이 matlab에의 명령 및 기능이 내장 된 원하는 것을 할 수 있다고 생각하지 않습니다. 그러나 그리드의 고해상도 버전과 함께 my other answer의 기술을 사용하면 도움이됩니다.

"고해상도"는 밀도가 높은 데이터 포인트가있는 균일하지 않은 그리드의 보간 버전을 의미합니다. 이는 밀도가 높은 데이터 포인트에서 텍스처를 샘플링하기 위해 피쳐를 surf으로 사용하여 그릴 수 있습니다. 그러나 균일하지 않은 격자 모양을 유지해야하므로 일반 2D 보간을 사용할 수 없습니다. 이것은 내가 생각해 낸 것입니다 :

X와 Y 포인트를 독립적으로 보간하려면이 함수를 두 번 호출해야합니다. 다음은 원래 그리드의 예와 각 방향으로 10 포인트가있는 보간 된 버전입니다.

Plot of the original and interpolated grids

여기 interp2texturemap와 그 고해상도 그리드를 사용하는 방법은 다음과 같습니다.

function nonUniformTextureMap 

% define the non-uniform surface grid 
X = [310,270,330; 430,410,400; 480,500,520]; 
Y = [300,400,500; 300,400,500; 300,400,500]; 
Z = [300,330,340; 300,310,330; 290,300,300]; 

% get texture data 
load penny % loads data in variable P 

% define texture grid based on image size 
% note: using 250-550 so that a,b covers the range used by X,Y 
[m,n] = size(P); 
[a,b] = meshgrid(linspace(250,550,n), linspace(250,550,m)); 

% get a high-res version of the non-uniform grid 
s = 200; % number of samples in each direction 
X2 = nonUniformGridInterp2(X, s, s); 
Y2 = nonUniformGridInterp2(Y, s, s); 

% sample (map) the texture on the non-uniform grid 
C = interp2(a, b, P, X2, Y2); 

% plot the original and high-res grid 
figure 
plot(X(:),Y(:),'o',X2(:),Y2(:),'.') 
legend('original','high-res') 

% plot the surface using sampled points for color 
figure 
surf(X, Y, Z, C, 'edgecolor', 'none', 'FaceColor','texturemap') 
colormap gray 

Plot of the mapped texture

+0

굉장한 친구. 나는 그 생각을 거짓말한다. 나는 이런 짓을하려고 노력할 것이고, 그것은 아주 잘 작동 할 것이다. 그럼에도 불구하고, 알고 싶습니다. 얼마나 오래 걸렸습니까? 빠른 것 같습니다! –

+0

@AnderBiguri 감사합니다! 아이디어를 얻은 후에 코드를 작성하는 데 몇 분이 걸렸습니다. 이 작은 데이터 세트는 멋지고 빠릅니다. "거대한"데이터 세트는 어떻게됩니까? – shoelzer

+0

나는 아직도 그것을 작정 짓는 것을 달성하지 못한다. 그것은 약간의 mroe complex이지만, 아이디어가 옳다. –

10

surftexturemap 속성은 직사각형 메쉬 및 직사각형이 아닌 사각형에 사용할 수 있습니다.

생성 비 사각형 데이터 포인트

다음 데이터 포인트 결과
% creating non-rectangular data points 
[X, Y] = meshgrid(1:100, 1:100); 
X = X+rand(size(X))*5; 
Y = Y+rand(size(X))*5; 

:

enter image description here

생성 높이 데이터 :

Z = sin(X/max(X(:))*2*pi).*sin(Y/max(Y(:))*2*pi); 

enter image description here

로드 사진 :

[imageTest]=imread('peppers.png'); 

enter image description here

및 메쉬에 텍스처로 매핑 :

surf(X,Y,Z, imageTest, ... 
    'edgecolor', 'none','FaceColor','texturemap') 

enter image description here

주, 그 데모를 위해,이 비에 대한 - 직사각형 그리드가 드물게 들쭉날쭉하게 채워져있어 다소 들쭉날쭉 한 텍스트가됩니다. ure. 점이 많을수록 격자 점의 왜곡과 관계없이 결과가 훨씬 좋아집니다.

격자 점의 수는 텍스처 이미지의 픽셀 수와 일치 할 필요가 없습니다.

~ 편집 ~

X와 Y 좌표가 이미지의 일부에만 사용할 수 있다면, 당신은 내가 당신의 질문을 이해 확실하지 않다

minX = round(min(X(:))); 
maxX = round(max(X(:))); 
minY = round(min(Y(:))); 
maxY = round(max(Y(:))); 

surf(X,Y,Z, imageTest(minX:maxX, minY:maxY, :), ... 
    'edgecolor', 'none','FaceColor','texturemap') 
+0

무엇 meshgrid를 사용하지 어떻습니까? 나는 meshgrid로 그것을하는 방법을 안다, 당신은 내가 나의 질문에 게시 한 링크에서 그것을 볼 수있다. 죄송합니다. 질문에 대답하지 않습니다. –

+0

@AnderBiguri : 업데이트 된 답변을 확인하고 처음에 질문을 신중하게 읽지 않으신 것을 용서해주십시오. –

+0

감사합니다. 머스터. 표면 격자에 대한 세부 사항을 추가하는 것을 잊어 버렸습니다. 제 편집을 확인하십시오. 나는 그 변화가 당신의 대답에 대해 작다고 생각하지만, 나는 대답을 찾을 수없는 것 같다. –

1

에 의해 따라 텍스처를 조정할 수 있습니다 ,하지만 당신이해야 할 일은 그리드의 X, Y 포인트에서 텍스처를 샘플링 (맵핑)하는 것입니다. 그런 다음 표면을 플롯하고 해당 샘플을 색상으로 사용할 수 있습니다.

다음은 질문에 입력 한 데이터를 사용한 예입니다. 별로 좋아 보이지는 않지만 더 많은 X, Y, Z 포인트를 사용하면 결과가 나옵니다.

% define the non-uniform surface grid 
X = [310,270,330; 430,410,400; 480,500,520]; 
Y = [300,400,500; 300,400,500; 300,400,500]; 
Z = [300,330,340; 300,310,330; 290,300,300]; 

% get texture data 
load penny % loads data in variable P 

% define texture grid based on image size 
% note: using 600 so that a,b covers the range used by X,Y 
[m,n] = size(P); 
[a,b] = meshgrid(linspace(0,600,n), linspace(0,600,m)); 

% sample (map) the texture on the non-uniform grid 
C = interp2(a, b, P, X, Y); 

% plot the surface using sampled points for color 
figure 
surf(X, Y, Z, C) 
colormap gray 

Plot of the mapped texture

+0

아니, 그게 내가 원하는 걸, 미안해. 나는이 표면에 그려진 텍스처 자체를 원한다. 방금 색상을 그렸지만 4 점 사이에 전체 질감이 있습니다. 첫 번째 이미지에서 각 요소의 텍스처를 추출하여 표면의 각 요소에 텍스처로 표시 (색상으로 표시 안 함)하고 싶습니다. –

+0

@AnderBiguri 이제 알겠습니다! 내 새로운 대답을 참조하십시오. – shoelzer