مرشح ممر BANDPAST من صورة FFT Applied Image. (مثل خوارزمية تصفية ImageJ Bandjpass)
-
24-09-2019 - |
سؤال
هناك وظيفة جيدة أحتاجها ، والتي يتم تنفيذها في برنامج Java: ImageJ. أحتاج إلى فهم الخوارزمية المستخدمة هناك. الوظيفة لها عدة معلمات:نص الارتباط
وقبل استخدام FFT ، يقوم بتحويل الصورة إلى صورة خاصة: يستخدم مرشح Bandpass خوارزمية خاصة لتقليل القطع الأثرية الحافة (قبل تحويل فورييه ، يتم تمديد الصورة من خلال ربط نسخ متطابقة من أجزاء الصورة خارج الصورة الأصلية ، وبالتالي لا توجد قفزات تحدث عند الحواف)
هل يمكن أن تخبرني المزيد عن هذا التحول الخاص؟ في الواقع تبليط الصورة المرآة.
أنا أكتب على C ++ وأرغب في إعادة كتابة هذا الجزء من البرنامج على C ++.
EDIT1: أنا بحاجة إلى فهم كيفية قيامه بتشغيل الصور المتطابق مع البلاط ، فقد يكون ذلك خاصًا. في البداية ، يقوم في البداية بتحويل الصورة إلى صورة بحجم جديد ، لذلك سيكون ذلك: تحويلها من 600 × 480 إلى 1024 × 1024 صورة بحجمها. كيف يتم استخدام البلاط هنا؟
EDIT2: من الصعب أيضًا فهم هذا الوصف لوظيفة tilemirrorrors:
يضع ImageProcessor (ROI) في معالج صورة جديد من عرض الحجم × الارتفاع y في الموضع (x ، y). تنعكس الصورة حول حوافها لتجنب التفاف حول تأثيرات FFT. ما المقصود بـ "... من عرض الحجم × الارتفاع y في الموضع (x ، y)."؟
EDIT3: لقد قمت بتطبيق مرشح Bandpass ، ويعطي نفس النتائج مثل البرنامج الأصلي. لكن الخوارزمية نفسها في البرنامج الأصلي (أيضًا في برنامجي) بطيئة للغاية ، أريد استخدام هذا المرشح لم يكن في برنامجي مرة واحدة ، ولكنه يحسب ما يقرب من 0.5 إلى 2 ثانية لكل مكالمة (اعتمادًا على قيمة المعلمة). يستخدم تحويل FHT (وليس FFT) ، هل هو بسرعة أكبر من FFT؟ أعتقد أن المرشح نفسه غير محسن ، يرجى الاطلاع على تطبيق وظيفة FilterLargesMall:مصدر الرمز
المحلول
لا أعرف بالضبط كيف تعمل هذه الوظيفة ، ولكن إليك الخوارزمية الأساسية لوظيفة مماثلة:
حدد أصغر قوة من اثنين (تسميها بالرسائل البيانية) التي تكون أكبر من أكبر بعدين الصورة (نسميها xSize & ysize).
قم بإنشاء صورة مربعة جديدة من الأخبار عن طريق الأخبار ونسخ محتويات الصورة إلى مركز الصورة الجديدة (أي يجب أن تبدأ أعلى اليسار من الصورة
(newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)
).املأ وحدات البكسل المتبقية على النحو التالي ، لكل بكسل في (x ، y):
- إذا
x < (newSize / 2 - xSize / 2)
, ، انسخ البيكسل في العمود(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x
والصف ص. - إذا
y < (newSize / 2 - ySize / 2)
, ، انسخ البيكسل في الصف(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
والعمود x. - إذا كان كلا ما سبق صحيحًا ، فقم بنسخ البكسل في العمود
(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x
, ، صف(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
. - إذا
x > (newSize / 2 + xSize / 2)
, ، انسخ البيكسل في العمود(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x
والصف ص. - إذا
y > (newSize / 2 + ySize / 2)
, ، انسخ البيكسل في الصف(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y
والعمود x. - إذا كان كلا ما سبق صحيحًا ، فقم بنسخ البكسل في العمود
(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x
والصف(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y
.
- إذا
من المحتمل أن تكون هناك مكتبات ستجعل ذلك أسهل (أي التقليب ونسخ بيانات الصورة) ، لكنني لست على دراية بـ C ++ ، ويجب أن يكون هذا سهلاً للغاية لترميز نفسك طالما أن الأداء ليس مشكلة كبيرة. كن حذرًا في التقريب عن الصور التي تحتوي على أبعاد غريبة: تأكد من أنها متسقة.