سؤال

أنا عالق مع مشكلة أساسية في ضغط MPEG-1 الخاص بي. لا بد لي من إنتاج ماكينات ماكيين داخل الصورة. يتكون Macroblock من 16 × 16 بكسل - حيث 4 × 8x8 هو الإنارة، 1 × 8x8 هو CB و 1 × 8x8 كر. في MATLAB أريد إنتاج مصفوفة خلية تحتوي على هذا. أي اقتراحات؟

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

المحلول

يبدو أنك تحاول معرفة أفضل طريقة لجمع مختلف 8-8 مصفوفات في متغير واحد. هناك بعض الطرق التي يمكنك القيام بها (مع كون الخيار الأول الذي سأختاره لحالتك):

  • قم بتسليم البيانات إلى مصفوفة ثلاثية الأبعاد:

    يمكنك استعمال ال قطة وظيفة إلى مصفوفات كومة من نفس الحجم على طول بعد معين. على سبيل المثال، إذا كان لديك 4 الخاص بك 8-8 مصفوفات الإنارة في المتغيرات L1, L2, L3, ، و L4, ، سوف يلقي ما يلي في 8-8-8--4 مصفوفة:

    luminance = cat(3,L1,L2,L3,L4);
    

    يمكنك أيضا إضافة الإضافية Cb و Cr المصفوفات لإنشاء 8--8-8-6 مصفوفة:

    macroBlock = cat(3,L1,L2,L3,L4,Cb,Cr);
    %# OR...
    macroBlock = cat(3,luminance,Cb,Cr);  %# Using luminance variable from above
    

    يمكنك بعد ذلك الفهرس macroBlock في الطريقة التالية للوصول إلى كل ما 8-8 المصفوفات التي تحتاجها:

    L2 = macroBlock(:,:,2);  %# Get the second luminance matrix
    Cb = macroBlock(:,:,5);  %# Get the Cb matrix
    
  • تخزين البيانات في صفيف خلية:

    نظرا لأن جميع المصفوفات الخاصة بك هي نفس الحجم، فإن خيار التسليط أعلاه ربما هو الأفضل. ومع ذلك، خيار آخر (وهو مفيد بشكل خاص إذا كنت ترغب في تخزين بيانات مختلفة الحجم أو النوع أو البعد) هو استخدام صفائف الخلية. وبعد مما يلي يخلق 1 -6-6 مجموعة الخلية التي تحتوي على المصفوفات المذكورة أعلاه:

    macroBlock = {L1 L2 L3 L4 Cb Cr};
    

    يمكنك بعد ذلك الفهرس macroBlock في الطريقة التالية للوصول إلى كل ما 8-8 المصفوفات التي تحتاجها:

    L2 = macroBlock{2};  %# Get the second luminance matrix
    Cb = macroBlock{5};  %# Get the Cb matrix
    
  • تخزين البيانات في هيكل:

    خيار آخر هو استخدام بنية لتخزين الخاص بك 8-8 المصفوفات. الهيكل لديه فائدة يمكنك الوصول إلى البيانات حسب اسم الحقل بدلا من الاضطرار إلى تذكر قيمة الفهرس. إليك كيفية تهيئة هيكل:

    macroBlock = struct('L1',L1,'L2',L2,'L3',L3,'L4',L4,'Cb',Cb,'Cr',Cr);
    %# OR...
    macroBlock = struct();
    macroBlock.L1 = L1;
    macroBlock.L2 = L2;
    macroBlock.L3 = L3;
    macroBlock.L4 = L4;
    macroBlock.Cb = Cb;
    macroBlock.Cr = Cr;
    

    التتابعين أعلاه إنشاء هيكل مع أسماء الحقول 'L1', 'L2', 'L3', 'L4', 'Cb', ، و 'Cr'. وبعد يمكنك بعد ذلك الفهرس macroBlock في الطريقة التالية للوصول إلى كل ما 8-8 المصفوفات التي تحتاجها:

    L2 = macroBlock.L2;  %# Get the second luminance matrix
    Cb = macroBlock.Cb;  %# Get the Cb matrix
    

نصائح أخرى

لم أحصل على ما تحتاجه. رمز يقوم بتقسيم الصورة في تلك الكتل؟

ما يجب أن تنشئه هو مصفوفة i (i، j، m، n) حيث M، n كتلة n'th و m'th 8x8 من الصورة، و j يشير إلى بكسل معين داخل الكتلة.

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