سؤال

أحاول أداء انحرف على صورة، مثل واحد يظهر هنا


(مصدر: microsoft.com.)
.

لدي مجموعة من البكسل التي تمثل صورتي وأنا غير متأكد من ما يجب القيام به معهم.

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

المحلول

طريقة أفضل بكثير للقيام بذلك رسم الخرائط معكوس.

أساسا، تريد "الاعوجاج" الصورة، أليس كذلك؟ مما يعني أن كل بكسل في الصورة المصدر تذهب إلى نقطة محددة مسبقا - The Predefinition هو مصفوفة للتحويل التي تخبرك بكيفية تدويرها ومقياسها وترجمةها أو القص، إلخ. الصورة التي تتخذ أساسا بعض التنسيق (x,y) على صورتك وقول ذلك، "حسنا، الموقف الجديد لهذا البكسل هو (f(x),g(y)).

هذا هو أساسا ما يفعله "تزييفها".

الآن، فكر في تحجيم صورة ... يقول، إلى عشر مرات الحجم. بحيث هذا يعني بكسل في (1,1) يصبح بكسل في (10,10) - ثم بكسل التالي، (1,2) يصبح بكسل (10,20) في الصورة الجديدة. ولكن إذا استمرت في القيام بذلك، فلن يكون لديك قيم لبكسل، (13,13) لان، (1.3,1.3) لا يتم تعريفه في صورتك الأصلية وستحصل على مجموعة من الثقوب في صورتك الجديدة - سيكون عليك التعامل مع هذه القيمة باستخدام البكسل الأربعة حولها في الصورة الجديدة، أي (10,10) , (10,20), (20,10), (200,2) - هذا يسمي الاستيفاء الثنائي.

ولكن فيما يلي مشكلة أخرى، لنفترض أن التحول لم يكن التحجيم البسيط وكان Affmen (مثل صورة عينة قمت بنشرها) - ثم (1,1) سيصبح شيئا مثل (2.34,4.21) ثم يجب عليك تقريبها في صورة الإخراج إلى (2,4) و من ثم يجب عليك القيام الاستيفاء التظليل على الصورة الجديدة لملء الثقوب أو الاستيفاء المعقدة - فوضوي أليس كذلك؟

الآن، هناك مستحيل للخروج من الاستيفاء، ولكن يمكننا الابتعاد عن القيام الاستيفاء الثقيل، فقط بمجرد. وبعد كيف؟ بسيط، رسم الخرائط معكوس.

بدلا من النظر إليها كصورة مصدر تذهب إلى الصورة الجديدة، فكر في المكان الذي سيأتي فيه بيانات الصورة الجديدة في الصورة المصدر! لذا، (1,1) في الصورة الجديدة ستأتي من بعض التعيينات العكسية في الصورة المصدر، قل، (3.4, 2.1) ثم قم بإجراء الاستيفاء الثنائي على الصورة المصدر لمعرفة القيمة المقابلة!

مصفوفة التحول

حسنا، فكيف تحدد مصفوفة التحول للتحول الآمن؟ هذا الموقع يخبرك بكيفية القيام بذلك عن طريق تكوين مصفوفات التحول المختلفة للتناوب، القص، إلخ.

التحولات:

alt text

التركيب:

alt text

يمكن تحقيق المصفوفة النهائية من خلال تكوين كل مصفوفة بالترتيب وأنت عكس للحصول على رسم الخرائط العكسية - استخدم هذا حساب مواقف البكسل في الصورة المصدر والمترابطة.

نصائح أخرى

إذا كنت لا تشعر وكأنه إعادة اختراع العجلة، تحقق من مكتبة OpenCV. إنه ينفذ العديد من وظائف معالجة الصور المفيدة بما في ذلك تحويلات المنظور. تفحص ال cvwarppperive. التي اعتدت عليها إنجاز هذه المهمة بسهولة تماما.

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

end_pixel_position = M*start_pixel_position + V

أين م هو تكوين التحولات البسيطة مثل الدوران أو الحمالات و الخامس هو متجه يترجم كل نقطة من الصور عن طريق إضافة معاملات ثابتة لكل بكسل.

على سبيل المثال، إذا كنت ترغب في تدوير الصورة، فيمكنك تحديد مصفوفة دوران على النحو التالي:

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

أين a هي الزاوية التي تريد تدوير صورتك بها.

بينما يستخدم Scaling مصفوفة للنموذج:

    | s1   0 |
M = |        |
    | 0   s2 |

أين s1 و s2 هي عوامل القياس على كلا المحورين.

للترجمة التي لديك فقط ناقلات الخامس:

    | t1 |
V = |    |
    | t2 |

هذا يضيف t1 و t2 لإحداثيات بكسل.

يمكنك بعد ذلك الجمع بين النصفات في تحويل واحد واحد، على سبيل المثال إذا كان لديك إما التحجيم والتناوب والترجمة التي سينتهي بها الأمر إلى شيء مثل:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

أين:

  • x1 و y1 هي إحداثيات البكسل قبل تطبيق التحويل،
  • x2 و y2 هي بكسل بعد التحويل،
  • M1 و M2 هي مصفوفات تستخدم للتوسع والتناوب (يتذكر: تكوين المصفوفات ليست متعة! مستخدم M1 * M2 * Vect != M2 * M1 * Vect),
  • T هو استخدام ناقلات الترجمة لترجمة كل بكسل.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top