أهلا ومرحبا بالجميع، وأرحب بالمنتجين خاصة =)

بداية: اقرأ الموضوع وأنت فـ نمط النسخة الخامسة من تصميم المنتدى، حتى لا يتغير تنسيق الموضوع


حسنا، الموضوع جاء بناء على سؤال من الأخ "عمـر" عن كيفية التعامل مع خام بنطاق لوني كذا وأبعاد كذا....!!، و هذا ما سأتناوله ف هذا الموضوع.[حصري هنا فقط]









طبعا كلنا على علم بالتقدم التكنولوجي الكبير في مجالات كثيرة وأركز هنا في مجال الشاشات ودقتها، ولهذا تحتم علينا كمنتجين أوتقنيين البحث عـــن طـرق
للتعامل مع التقدم التكنولجي الكبير فيما يخص أبعاد ملفات الفيديو ودقتها و نطاق الالوان التي تحتويها، بدأ أغلبنا بـ مشاهدة ملفات فيديو بأبعاد SD\HD\FHD
والآن UHD 4K\8K وهو اختصار لـ Ultra High Definition دقة وضوح عالية أو دقة وضوح فائقة التي فقط ترتبط بأبعاد "4كـ [3072 ×4096] 8كـ [7680×4320]"،
و نحن لا نواجه مشكلة عندما يكون عندنا فيديو مرتبـط بتقنية أو مبنية على تقنية Standar Dynamic Range\SDR،إنما نواجه مشكلة أو تكمن المشكلة
عندما يكون ملفات الفيديو ""مرتبطة أو مبنية"" على تقنية HDR10 وهي اختصار للمصطلح الانجليزي High Dynamic Range وهو مصطلح يستخدم لوصــف
التقنيات ذات المدى الضوئي الديناميكي العالي، حيث يجب على المواد الفيلمية المطلوب عرضها بتقنية HDR أن يتم تصويرها بكاميرا داعمة للتقنية ذاتهــا،
فالكاميرات العادية غير قادرة على التصوير بهذه التقنية، وإن كانت بعض أجهزة التليفزيون تؤكد على قدرتها على تعديل الصورة لمقاربة هذه التقنية إلا أن الـمـواد
المصورة بكاميرا داعمة لها تقـدم تجربة رؤية ومشاهدة أفضل بكثير.


نحن نعلم أن تقنية 4K مثلا تقدم عدد أكبر من البيكسلات في إطار الصورة،تقدم تقنية HDR بيكسلات أفضل وأغني، مما يجعل أجهزة التليفزيون المدعومة بها
قادرة على عرض ملايين الألوان أكثر من أجهزة تليفزيون SDR،بالإضافة إلى قدرتها على إنتاج فوارق واضحة "بين المناطق الداكنة والمناطق الساطعة فـ الصورة"،
وباختصار يمكن القول إن تقنية HDR هي تقنية متعلقة بالصورة تعمل على مساعدة التليفزيون على عرض الفيديو بسطوع أكبر، تباين أعلى بين درجات الألوان
المختلفة بالإضافة إلى وضوح أعمق وأغني للون الأسود والنقاط الداكنة في الفيديو.



حسنا، خرجنا قليلا عن الموضوع الأساسي ونرجع له الآن، ذكرت سابقا أننا نواجه مشكلة عندما تكون الصورة أو الفيديو "مرتبط أو مبني" على تقنية HDR\10
والتي لاتخرج عن نطاق ألوان Rec 2020\ BT 2020 والتي تكون بـ عمق لوني 10 بت أو 12 بت فقط، ويتميز بـ نطاق ألــواني أكبر و سطوح عالي، ومـع
الأسف أغلــب أجهزتنا لا تدعم هذه التقنية، فـ نواجه مشكلة في أنه لا يمكننا رؤية "الفيديو" تحديدا بألوان وسطوع شبه حقيقي إنما بعيدة جدا عن الحقيقة،
لذلك نحن بحاجة إلى طريقة لجعل الفيديو المبني علــى تلك التقنية يعمــل بشكل صحيح على حواسبنا وهواتفنا إلخ، وهذه الطــريقة تكمن أساسا
فـيما يعرف بـ Tone mapping وهي تقنية أو عملية تستخدم في معالجة الصور ورسومات الكمبيوتر لإعادة تعيين مجموعة من الألوان إلى أخرى لتقريب مظهر
الصورة عالية الديناميكية في بيئة ذات نطاق ديناميكي محدود. يعني نحول ما يجب تحويله إلى نطاق قابل للعرض لتلك الأجهزة مع الحفاظ على تفاصيل الصورة
ومظهر ألوان أقرب إلى الصورة الأصلية.


الشخص الذي يرى من من فتحة اتساعها نصف متر ليس كـ الشخص الذي يرى من فتحه اتساعها ربع متر، فـ في الأولى الشخص يرى مشاهد أكبر من الحالة
الأخيرة وهي عندما يرى شخص من فتحة اتساعها ربع، ولذلك تعتبر تقنية أو عملية Tone mapping حل لمشكلة المدى الضوئي الضحل للشاشات. حيث كما
قلت سابقا وذكرت أن كثير من أجهزتنا لا تدعم تقنية HDR\10 - 4K\8K والتي تكون بنطاق ألوان Rec 2020\ BT 2020 و بـ عمــق لوني 10 بت أو 12 بت فقط،
ونرى الصورة أو الفيديو بشكل مختلف تمـاما عن الطبيعية، حيث يمكنني أن اوصف أن المنظر أشبه بنثر"الاسمنت الأسود" على صورة مشبعة بالألوان وبـ الإضـائة
والسواد، وأعود أذكــر أن اغلب أجهزتنا غيـر قادرة على عرض الصور ذات المدى الضوئي العالي،وهذا ما يستدعي استخدام تقنية ال Tone-Mapping والهدف من
هذه التقنية هو تقريب اضاءة ولون الصورة أو الفيديو إلى المدى الديناميكي الضوئي العالي للصورة الأصلية أو الفيديو الذي نواجه مشكــلة معه، بحيث تستطيع
شاشاتنا عرضها بشكل صحيح.

باختصار عملية "
Tone-Mapping" راح تخلينا نحول الفيديو الذي بتقينة ونطاق HDRإلى نطاق SDR

نلاحظ أن نطاق ألوان 2020 مايقارب ضعف نطاق ألوان 709 إلى حد ما





نلاحظ أن الصورة الملتقطة من فيديو بنطاق ألوان 2020 وبعمق 10 بت، قاتمة وباهتة [والسبب أن جهازي لا يدعم...!]
[لاتركزوا ع الجودة إنما ع الألوان والإضاءة][الصورة على اليسار بعد التعديل]







قبل أن نبدأ فعليا، قمت بتجهيز ورفع الملفات المستخدمة والفلاتر والسكربتات والانكودرز، للتحميل-> [https://files.fm/u/k76wgvs8]
+ موجود فيديو كليب مدته لا يتجاوز الدقيقة، قمت بالتجربة عليه "Exodus_UHD_HDR.mp4"


والأدوات المستخدمة [AviS\FFmpeg\VS\x264]

لذلك سأشرح 3 طرق للقيام بعملية التحويل والتصحيح حتى أرضي جميع الأذواق، رغم أني أنصح بالعمل على برنامج VS بدل AVS



[الطريقة الأولى]: راح نستخدم أداة FFmpeg وهي أداة مشهورة ولها استعمالات كثيرة متعددة أهمها التشفير(حسب الانكودر المتوفر) وفك التشفير و الفلترة المحدودة

كود:
-vf zscale=t=linear:npl=150,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable,zscale=t=bt709:m=bt709:r=tv,format=yuv420p

راح نستخدم فلتر zscale الي هو مأخوذ من مكتبةـ z ـ [https://github.com/sekrit-twc/zimg] وهذي المكتبة صممت خصيصا للتحويل في الألوان والعمق
اللوني مع الحفاظ على نسبة العرض والارتفاع [ https://en.wikipedia.org/wiki/Displa...puter_displays ] [Display aspect ratio: 16:9]



راح نقوم بتحويل الفيديو إل نمط لوني أقرب ما يكون إلى RGB\32bit، لماذا قلت "أقرب" لأن التحويل من الأساس لن يعطينا النمط أو القيمة
الحقيقية لألوان RGB\32bit [نقوم بذلك حتى لانفقد بيانات الألوان لذلك نعطي أقصى بت متوفر]، مع الذكر أن colour primaries\الألوان الأولية هي نفسها
لم تتغير لأن النمط الأساسي للون YUV فـ Y يمثل الـ [luminance\الإضائة أو السطوع] و[UV] يمثل [chrominance\الألوان] كل حرف [UV] يمثل لونين من الألوان،
فـ colour primaries يقوم بأخذ الألوان الرئيسية YUV ويقوم بمزجها ليعطينا لون أو طيف لوني آخر. وأيضا وضعنا أمر اللوما\السطوع [npl=150] ودرجة السطوع فتقنية
SDR\TV وغاالبا ماتكون القيمة بين [100 إلى 200]ـ لذلك يمكن تعديل القيمة ويفضل تكون بين 150 إلى 200، بعد ذلك نضع أمر التحويل وهو جعل [الألوان الأولية]
بناطق لوني bt709 والنتيجة p = primaries \ [zscale=p=bt709] ـ وبعد ذلك راح نوصل للفلتر المهم أو عملية مهمة وهي استخدام خوارزمية [tone-mapping
وقد شرحت ف الفقرة الثانية أهميتها، وهذي العملية فـ أداة FFmpeg لديها 7 أنماط مختلفة للتعامل مع اللون والإضائة بزاوية مختلفة لذلك نستخدم هذا
الأمر [tonemap=tonemap=hable] وقد استخدمت نمط أو خيار [hable] لأنه أعطاني نتجية أفضل ويمكن أن تختار [mobius] وترى النتيجة وتغير الإعدادات.

# جميع الأنماط هنا
[ https://ffmpeg.org/ffmpeg-filters.html#tonemap ]


وفي النهاية نحول ألوان transfer matrix إلى BT709 ونخلي البت والفضاء اللوني والاختزال اللوني YUV420 8-bit - وهناك أمر إضافي وهو لإظهار المعلومات ف الميديا انفو للفيديو وماقمنا[اختياري]
به من تحويل نطاق الألوان إلى color_primaries 1 \ color_trc 1 \ colorspace 1 ] - BT 709] وطبعا لا ننسى نختار نوع الإنكودر الذي راح نستخدمه
للانتاج وهــ x264 ـو [c:v = video codec] [c:v libx264 -crf 18 -preset slow-]
هناك أمر لم أذكره وهو [أضيف مؤخرا]
كود:
r=tv

(r = rang (color rang
حددنا هنا النطاق اللوني، عندنا نوعين من النطاق نطاق كامل ونطاق ضيق أو محدود للألوان
full-rang = 0-255 color \
JPEG => RGB >>> =>0-255 color space \ 8bit
limited-rang = 26-2
35 \ MPEG => yuv=> 16-235 color space \ 8bit
أعتقد أغلب الخامات أنمي أو أفلام تكون ضمن النطاق اللوني المحدود ولذلك وضعنا النطاق اللوني المحدود للألوان tv = television

النتيجة النهائية: [ نلاحظ أننا استدعينا الـ فيديو مباشرة دون الاستعانة بـ avs او vs، لكن هناك طريقة ثانية، اقرأ الفقرة التالية ->]

كود:
ffmpeg.exe -i INPUT.mp4 -vf zscale=t=linear:npl=150,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -color_primaries 1 -color_trc 1 -colorspace 1 -c:v libx264 -crf 18 -preset slow Output_FFmpeg.mkv


في مجلد FFmpeg راح تجد الأداة وسكربتات وملف avs لا ستدعاء وملفـ 2 ـي bat لأني قمت بـعمل ذلك بطريقة استخدام أداة FFmpeg ف الانتاج والفلترة
والتحويل فقط، اسم ملف الباتش [FFmpeg_] حيث استدعينا ملف الفيديو مباشرة، والطريقة أخرى أني استخدمت أداة FFmpeg ف الفلترة والتحويل ثم انتاج
بالانكودر x264 تسمى طريقة البايب(الانبوب)، اسم ملف الباتش [Pip_ffmpeg_x264] وطبعا راح نحتاج سكربت افس لاستدعاء ملف الفيديو، اسم السكربت [Test_ffmpeg]


ملاحظة: تلاحظون أنني استخدمت أمر فك التشفير أو أمر استدعاء الفيديو [LWLibavVideoSource] لأنني أحيانا أو نادرا ما أواجه مشكلة مع فلتر فك تشفير الفيدو -> [FFVideosource]،
المهم ف الفلتر المستخدم حددت الفريمات التي يجب أن تكون، و أحيانا الأفس لايفتح فيديو بعمق لوني 10 لذلك حولت العمق اللوني إلى [YUV420P8]
واستخدمت أمر تريم لأن عملية التصحيح والتحويل بطيئة جدا خاصتا مع avisynth لذلك جربت الأمر فقط على "فريم واحد" [(trim(0,1]


كود:
LWLibavVideoSource("Exodus_UHD_HDR.mp4",fpsnum = 24000, fpsden = 1001, format = "YUV420P8" ).trim(0,1)




[الطريقة الثانية]: _راح نقوم بتصحيح مايجب تصحيحه وتغييره بأداة +Avisynth
تحميل الاداة من هنا : https://www.videohelp.com/software/AviSynth-Plus

والفلاتر بما فيها الملفات الموجودة في مجلد "Avisynth Filters" ضعها في مجلد "+Pluging" ـ


حسنا، راح نقوم بفعل الامر ذاته مع ماقمنا بفعله عند استخدام FFmpeg لذلك لن أشرح أي شيء لأن الأمر مجرد تكرار

راح نضع الامر التالي [انظر في مجلد x264_32_Avs]


كود:
z_ConvertFormat(pixel_type="RGBPS",colorspace_op="2020ncl:st2084:2020:l=>rgb:linear:2020:l", dither_type="none")
DGHable() 
z_ConvertFormat(pixel_type="YV12",colorspace_op="rgb:linear:2020:l=>709:709:709:l",dither_type="ordered")
z_Spline64Resize(1280,720)

أهم شي هو أننا أولا نحول الفيديو إلى النمط اللوني RBG بمعدل بت ديبث 32 فـ [Pixel type = "RGBPS" -> 32 Bit depth ] لكن نطاق اللون سيبقى كما
هو [2020]، بعد ذلك راح نستخدم فلتر تعديل اللون والإضائة، مع الذكر أن هناك فقط فلترين أو خيارين متوفر في أفيسينث، لكن فـ FFmpeg متوفر فيها
7 أنماط كما ذكرت سابقا، لكن في avisynth ـ حاليا متوفر Hable و Reinhard فقط من أنماط عملية الـ tonemap، وأنا استخدمت Hable لأني أجده
هنا أفضل (في إعداداته الافتراضية)، المهم بعد ذلك نرجع ونحول إلى النمط اللوني YUV12 وبفضاء لوني RC709


بعد ذلك قررت أصغر الأبعاد، وهناك سبع دوال متوفرة ف فلتر avsresize لتصغير الأبعاد انظر ملف README.md، و الأمر الأخير راح نفعـّل فلتر MT المخصص
لتسريع الانتاج ونضع الأمر prefetch المرتبط بنواة الجهاز، ويتمثل قيمة الفلتر بـ عدد الثريدات التي ستستخدمها أو المتاح لدينا ف نظام الحاسب، أنا
وضعت أربعه، وفي حال وضعت قيمة صفر راح يستخدم كل ما أمكن
من قوة نظامك ف الانتاج، هناك ملفين للانتاج [باتش]، يعني طريقتين مختلفين
ف استدعاء سكربت افس والانتاج، طريقة [01] وهناك طريقة [02]، لك الخيار.



Reinhard VS Hable







[الطريقة الثالثة]: عن طريق برنامج VS الثوري!

ونفعل كما فعلنا ف الطريقة الأولى والثانية لذلك لن أعيد الشرح كل ما في الأمر أن الطريقة تختلف

طبعا حاليا نوجد ثلاث انماط متوفرة لـ VS في عملية الـ tonemap هي [Hable + Reinhard + tmap.tm => hable] الفلتر أو النمط الثالث
لم أذكره لأني أجده سيء ف إعداداته، على كل نلاحظ أن سكربت tmap.tm هو نفسه hable بس يعطي نتيجة مختلفة بسبب الإعدادات وطريقة العمل،
المهم في نهاية السكربت جعلت الإعدادات HD\YUV420\8bit. وللتذكير لازم تثبت سكربت tmap حتى يمكنك استخدام أمر tmap.tm


النمط الثالث + للاستزادة https://github.com/ifb/vapoursynth-tonemap [لازم تقوم بتحميل و تثبت هذا الفلتر]





حسنا، السكربت الأساسي كما هو فـ الأسفل [بدون عملية أو فلتر tonemap]، وراح نظيف عليه أحد الانماط ولك الخيار،
إما [
Hable أو Reinhard أو نستخدم سكربت آخر مبني على نمط Hable لكن يعطي نتيجة مختلفة]

كود:
src = core.lsmas.LWLibavSource(source='Exodus_UHD_HDR.mp4', fpsnum = 24000, fpsden = 1001,format="yuv420p8").std.Trim(0,10)
src =core.resize.Bicubic(clip=src, format=vs.RGBS,filter_param_a=0.0,filter_param_b=0.75, range_in_s="limited", matrix_in_s="2020ncl", primaries_in_s="2020", primaries_s="2020", transfer_in_s="st2084", transfer_s="linear",dither_type="none", nominal_luminance=1000)
src =core.resize.Bicubic(src,1280,720, format=vs.YUV420P8, filter_param_a=0.0, filter_param_b=0.75, matrix_s="709", primaries_in_s="2020", primaries_s="709", transfer_in_s="linear", transfer_s="709",dither_type="ordered")
src.set_output()
أحد هذه الأوامر أو الطرق الثلاثة راح نضعها بعد السطر الثاني من السكربت الذي ف الأعلى


[Hable.vpy]
كود:
src = core.tonemap.Hable(src,exposure=5.5,w=5)
[Reinhard.vpy]
كود:
src = core.tonemap.Reinhard(src,exposure=1.6 , contrast=0.5,  peak=1)
[tmap.tm.vpy]
كود:
src =tmap.tm(src,source_peak=1000,desat=50,show_satmask=False,lin=True,show_clipped=False)

السكربتات الثلاثة موجودة فـ مجلد VS بهيئتها الكاملة، وبهذا أكون قد انتهيت من شرح وذكر الطرق الثلاثة.







1- ابحث عن أفضل طريقة والأسهل لك، وليس مايعجبك من الطرق التي ذكرتها، ولازم تتأكد أنك استخدمت عملية tonemap لم تحدث أمر غير طبيعي
ف الجودة أو الألوان، لا نريد نتيجة تكون فيها الألوان محروقة او داكنة او ساطعة جدا.

2- هذه الطرق أستطيع أن أقول أنها غير مستقرة وليست نهائية، لأن هذي الطرق حديثة صارلها سنتين ونصف تقريبا، كون خامات [4 ,8 ك]
المبنية على تقنية HDR10ـ بدأت تظهر بشكل أكثر منذ بداية عام 2017 أو قبل .

3- كوني مستخدم برنامح VS أجده أسرع بكثير عند الانتاج مقارنة بـ Avisynth بنسبة 40% وقد تزيد لدى البعص، لكني لا أخفي أني
أجد النتيجة النهائية بـ أفس أفضل بسبب الإعدادات الافتراضية للفلاتر المستخدمة.

4- هذي الطرق شرحتها خصيصا لخامات (HDR(4K\8K) (10-12bit|BT2020 ـ

5- ستكون النتيجة أفضل بكثير في حال انتجت بعد التعديل بالاختزال اللوني [Chroma subsampling 444PP\10bit]
بدل الاختزال [CS 420PP\10bit]

6- جميع الملفات من سكربتات وفلاتر وانكودرز جاهزة يمكنك تحميلها من رابط فـ بداية الموضوع [على طبق من ذهب]

7- لا تسألني عن شيء وأنت مبتدأ فـ vs أو avs.

8- لست نقنيا لذلك أحيانا لم استخدم المصطلح التقني الصحيح، إنما حاولت قدر الإمكان تقريب المعنى

9- أتمنى مِن مَن له فكرة أكبر عن بعض الأمور التي تناولتها أن يرشدني في حال ارتكبت خطأ

10- نعم الأخطاء الإملائية كثيرة، لذلك شيئا فشيئا راح أضيف وأعدل إن شاء الله







HDR10
HDR
4K
8K
Avisynth
VS
FFmpeg
RAW
Python
tonemap
RGBPS
BT2020
BT709
RC709
RC2020
X264
RBG32