سؤال

لدي مثلث في (u,v) ينسق في صورة. أود رسم هذا المثلث بإحداثيات ثلاثية الأبعاد (X,Y,Z) تم تعيين نسيج مع المثلث في الصورة.

هنا، u,v,X,Y,Z جميع المتجهات مع ثلاثة عناصر تمثل الزوايا الثلاثة للمثلث.

لدي حل قبيح للغاية وبطيء وغير مرضٍ فيه:

  1. استخراج جزء مستطيل من الصورة
  2. قم بتحويله إلى مساحة ثلاثية الأبعاد مع التحول المحدد بواسطة النقاط الثلاث
  3. ارسمها بالسطح
  4. أخيرًا ، تخفي كل ما ليس جزءًا من المثلث مع Alphadata

بالتأكيد يجب أن يكون هناك طريقة أسهل للقيام بذلك؟

هل كانت مفيدة؟

المحلول

لدي ما أعتقد أنه حل أفضل بالنسبة لك ينطوي على خطوتين. أولاً ، يستخلص جزء مستطيل من صورتك ، نصفها هو القسم الثلاثي ليتم استخدامه كخريطة نسيج وسيتم تجاهل نصفها. ثم يتم تطبيق خريطة الملمس هذه على كائن سطح ثلاثي الأبعاد يتم ضبط نقاطه لجعله مثلثًا بدلاً من الرباعي.

على سبيل المثال ، سأعرض هنا ، سأستخدم القيم التالية لمعلماتك المختلفة ، على افتراض أن لديك مثلثًا يتم تصنيف نقاطه على أنه "الأصل" (قمة المثلث) ، والنقطة "A" ، والنقطة "B" في مساحة الصورة (كما في الصورة الأولى أدناه):

x = [0.1 0.9 0.8];   % [xorigin xA xB] coordinates in 3-D space
y = [0.9 0.1 0.8];   % [yorigin yA yB] coordinates in 3-D space
z = [0.1 0.1 0.9];   % [zorigin zA zB] coordinates in 3-D space
origin = [150 350];  % Vertex of triangle in image space
U = [300 -50];       % Vector from origin to point A in image space
V = [50 -250];       % Vector from origin to point B in image space
img = imread('peppers.png');  % Sample image for texture map


استخراج خريطة الملمس عبر التحول الإسقاطي:

هذه الخطوة تستخدم أدوات معالجة الصور المهام maketform و imtransform لإجراء تحويل إسقاط لجزء من الصورة التي تحتوي على المثلث الذي تريد استخدامه كخريطة نسيج. لاحظ أنه نظرًا لأن الصور يجب أن تكون مستطيلة ، فإن قسمًا ثلاثيًا إضافيًا يحدده النقاط (O,B,C) يجب تضمينها.

enter image description here

سيكون الجزء الثلاثي من الصورة التي تريدها في النصف الأيمن السفلي من الصورة ، في حين أن الجزء "الحشو" الثلاثي الإضافي سيكون في الجزء العلوي الأيسر. لاحظ أن هذا المثلث الإضافي يمكن أن يمتد خارج الصورة ، مما سيؤدي إلى ملء جزء منه باللون الأسود بشكل افتراضي. إليك الرمز اللازم لإجراء التحويل الإسقاطي الموضح أعلاه:

A = origin+U;  % Point A
B = origin+V;  % Point B
C = B-U;       % Point C
[nRows, nCols, nPages] = size(img);  % Image dimensions
inputCorners = [origin; ...          % Corner coordinates of input space
                A; ...
                B; ...
                C];
outputCorners = [1 nRows; ...        % Corner coordinates of output space
                 nCols nRows; ...
                 nCols 1; ...
                 1 1];
tform = maketform('projective', ...  % Make the transformation structure
                  inputCorners, ...
                  outputCorners);
triTexture = imtransform(img,tform, 'bicubic', ...  % Transform the image
                         'xdata', [1 nCols], ...
                         'ydata', [1 nRows], ...
                         'size', [nRows nCols]);

لاحظ أن هذا الرمز سيقوم بإنشاء صورة نهائية triTexture هذا هو نفس حجم صورة الإدخال img.


تخطيط السطح المسموح بالملمس الثلاثي:

إن تخطيط السطح الآن بسيط للغاية ، على افتراض أنك طلبت القيم في x,y,z المتغيرات بحيث تكون الإحداثيات الخاصة بنقطة الأصل في المؤشرات الأولى ، والإحداثيات للنقطة A موجودة في المؤشرات الثانية ، والإحداثيات للنقطة B في المؤشرات الثالثة. يمكنك الآن إنشاء مجموعات جديدة من الإحداثيات السطحية 2-2 X,Y,Z تحتوي على نسختين من النقطة B ، والتي تسبب نصف السطح فقط (أي النصف الذي يحتوي على الصورة الثلاثية المطلوبة كخريطة نسيج). إليك الرمز للقيام بذلك:

index = [3 3; 1 2];  % Index used to create 2-by-2 surface coordinates
X = x(index);        % x coordinates of surface
Y = y(index);        % y coordinates of surface
Z = z(index);        % z coordinates of surface
hSurface = surf(X, Y, Z, triTexture, ...  % Plot texture-mapped surface
                'FaceColor', 'texturemap', ...
                'EdgeColor', 'none');
axis equal            % Use equal scaling on axes
axis([0 1 0 1 0 1]);  % Set axes limits
xlabel('x-axis');     % x-axis label
ylabel('y-axis');     % y-axis label
zlabel('z-axis');     % z-axis label

وإليك السطح الثلاثي المسموح به الناتج الذي ينشئه ، مع إضافة أقحم لإظهار أن خريطة الملمس تحتوي على الجزء الثلاثي الصحيح من الصورة الأصلية:

enter image description here

نصائح أخرى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top