5.9. العمليات الحسابية¶
تطلي عائلة الرسم في القسم السابق داخل صورة. أما العائلة الحسابية فتدمج صورتين في ثالثة -- بجمع قيم بكسلاتهما معاً، أو طرح إحداهما من الأخرى، أو أخذ الأدنى أو الأعلى عند كل موضع. تلك المجموعة الصغيرة من العمليات الحسابية على مستوى البكسل هي ما تُبنى عليه مفاضلة الإطارات، وطرح الخلفية، وتراكم التعريض، وحفنة من الأنماط التقليدية الأخرى.
العائلة الحسابية على الصنف Image صغيرة بما يكفي لتعدادها دفعة واحدة:
add()--self + otherلكل بكسل، محصورةً عند الحد الأقصى للصيغة.sub()--self - otherلكل بكسل، محصورةً عند0في الأسفل.rsub()--other - selfلكل بكسل، محصورةً عند0(الحساب نفسه مثلsubمع عكس المُعاملات).min()-- الحد الأدنى لكل بكسل من القيمتين.max()-- الحد الأقصى لكل بكسل.difference()--|self - other|لكل بكسل، أي الفرق المطلق.
إضافةً إلى عمليتين متصلتين على صورة واحدة:
invert()-- استبدال كل بكسل بـ255 - pixel(أو الحد الأقصى المكافئ للصيغة).
تدرجان مصدران A و B، ونتيجة كل عملية زوجية طُبّقت عليهما. تعمل كل عملية موضعاً تلو الآخر -- وما يظهر في النتيجة عند أي موضع يعتمد فقط على بكسلَي المصدرين عند ذلك الموضع.¶
5.9.1. صيغتان للمُعامل¶
تقبل كل من طريقتَي الصورتين أياً من الصيغتين لمُعاملها الثاني:
صورة
Imageأخرى بالأبعاد نفسها. يجري الحساب موضعاً تلو الآخر -- النتيجة عند(x, y)هي العملية المُطبّقة على بكسلَي المصدر عند(x, y)في كلتا الصورتين.قيمة عددية مفردة -- عدد صحيح لتدرج الرمادي، أو صفّ
(r, g, b)لـ RGB565. تنطبق القيمة المفردة نفسها عند كل موضع.
تفيد الصيغة العددية المفردة عندما يريد التطبيق إزاحة كل بكسل بمقدار ثابت. img.add(40) تسطّع الصورة كلها بمقدار 40؛ و img.sub((20, 20, 20)) تعتّم كل بكسل بمقدار 20 لكل قناة؛ و img.max(50) ترفع أي بكسل دون 50 إلى 50 وتترك الباقي وشأنه -- وهو نوع العملية التي تحوّل أرضية مستشعر شبه سوداء إلى رمادي داكن مسطّح لتعمل عليه المراحل اللاحقة.
5.9.2. الحصر¶
تبقى قيم البكسل داخل نطاق الصيغة في كل عملية. وبالنسبة لقناة 8 بت يعني ذلك 0 -- 255: أي شيء كان سيفيض متجاوزاً 255 يُحصر عائداً إلى 255، وأي شيء كان سينزل دون 0 يُحصر صاعداً إلى 0. ولا يوجد التفاف.
ذلك الاختيار مهم عملياً. add التي تسطّع البكسلات لا تنتج أبداً أثر تعتيم مفاجئ عند الطرف الساطع حيث كان الحساب سيفيض لولا ذلك؛ و sub التي تعتّم البكسلات لا تنتج أبداً أثر تسطيع مفاجئ عند الطرف الداكن حيث كان سينقص لولا ذلك. تبقى النتائج ذات معنى بصري على حساب بعض فقدان المعلومات عند الأطراف المشبعة.
الحصر هو أيضاً سبب اختلاف ناتجَي sub و rsub عن بعضهما. تعطي img_a.sub(img_b) الجزء من a الأسطع من b وصفراً في كل ما عداه؛ وتعطي img_a.rsub(img_b) الجزء من b الأسطع من a. وأيٌّ منهما مفيد لكشف التغيّر أحادي الجانب -- إن كان التطبيق يهتم فقط بالبكسلات التي صارت أسطع، أو فقط بالبكسلات التي صارت أدكن -- لكن أياً منهما لا يلتقط كامل التغيّر بين إطارين.
5.9.3. عملية الفرق¶
لكشف التغيّر ثنائي الجانب، العملية التي يُلجأ إليها هي difference()، التي تحسب |self - other| عند كل موضع -- الفرق المطلق، الخالي من الإشارة. يظهر كل بكسل تغيّر في أي اتجاه بقيمة غير صفرية في النتيجة، بمقدار يتناسب مع حجم تغيّره عند ذلك الموضع.
تلك الخاصية -- غير صفرية تحديداً حيث تختلف الصورتان -- هي ما يجعل difference فرس الرهان في كشف التغيّر إطاراً بإطار. إطار مرجعي مخزّن عند بدء التشغيل والتقاط جديد، يمرّان عبر difference، ينتجان صورة تشير بكسلاتها غير الصفرية إلى كل موضع تحرك فيه شيء في المشهد أو تغيّر سطوعه.
5.9.4. التحديد عبر القناع¶
تقبل جميع الطرق الحسابية الوسيطة المفتاحية mask التي قُدّمت في صفحة المناطق والأقنعة. عند تمرير قناع، تعمل العملية فقط عند المواضع التي يكون فيها القناع غير صفري؛ وفي كل ما عداها تُترك صورة الوجهة وشأنها.
يظهر ذلك التركيب في نمطين. الأول هو تقييد عملية بمنطقة معروفة: جمع إطارين معاً فقط داخل مربع إحاطة علامة مكتشفة مثلاً. والثاني هو بناء إطار مركّب قطعةً قطعة -- min على سلسلة من الإطارات داخل قناع المقدّمة، و max على السلسلة نفسها داخل القناع المكمّل -- ذلك النوع من الأنماط.
5.9.5. في المكان، مع الحفاظ على المدخلات¶
تتبع الطرق الحسابية كلها الاصطلاح التشغيلي الذي تأسس سابقاً: كل منها تعدّل الصورة المصدر في المكان وتُعيد الصورة نفسها للتسلسل. تكون بكسلات المصدر قد زالت بعد الاستدعاء -- مستبدلةً بنتيجة العملية مقابل ما مُرّر بوصفه المُعامل الثاني.
عندما يحتاج التطبيق إلى الحفاظ على كلا المدخلين، النمط الآمن هو نسخ أحدهما أولاً:
diff = current.copy() # leaves current intact
diff.difference(reference) # diff now holds the absolute difference
ذلك النمط -- انسخ ثم اعمل -- هو العمود الفقري لأي مسار مفاضلة إطارات، حيث يجب أن يبقى الإطار المرجعي بعد المقارنة كي يُعاد استخدامه على الإطار الملتقط التالي.
بست عمليات دمج، وعمليتين على صورة واحدة، وفرس رهان للفرق المطلق، والكلمة المفتاحية mask للتحديد، تغطي مجموعة أدوات حساب البكسل تركيبات السطوع والقنوات التي تحتاجها الرؤية الآلية التقليدية. أما الأدوات المتبقية الشبيهة بالحسابية فتعمل على السطح بتاً ببت لا قيمةً بقيمة.