النواة (معالجة الصور)
تتضمن هذه المقالة قائمة بالمراجع العامة ، لكنها تفتقر إلى الاستشهادات المضمنة الكافية . ( أكتوبر 2023 ) |
في معالجة الصور ، النواة أو مصفوفة الالتفاف أو القناع هي مصفوفة صغيرة تستخدم للتشويش، والشحذ، والنقش، واكتشاف الحواف ، والمزيد. يتم تحقيق ذلك عن طريق إجراء التفاف بين النواة والصورة . أو ببساطة أكبر، عندما تكون كل بكسل في الصورة الناتجة دالة للبكسلات القريبة (بما في ذلك نفسها) في الصورة المدخلة، فإن النواة هي تلك الدالة.
تفاصيل
التعبير العام للالتفاف هو
أين الصورة المفلترة، هي الصورة الأصلية، هي نواة المرشح. يتم أخذ كل عنصر من عناصر نواة المرشح في الاعتبار بواسطة و .
اعتمادًا على قيم العناصر، يمكن أن يتسبب النواة في مجموعة واسعة من التأثيرات:
| عملية | نواة ω | نتيجة الصورة g(x,y) |
|---|---|---|
| هوية |
| |
| كشف التلال أو الحافة |
| |
| ||
| شحذ |
| |
| طمس المربع ( مُعاير ) |
| |
| التمويه الغاوسي 3 × 3 (تقريب) |
| |
| التمويه الغاوسي 5 × 5 (تقريب) |
| |
| إخفاء غير حاد 5 × 5 استنادًا إلى التمويه الغاوسي مع مقدار 1 وعتبة 0 (بدون قناع صورة ) |
|
|
ما ورد أعلاه هو مجرد أمثلة قليلة للتأثيرات التي يمكن تحقيقها عن طريق دمج النوى والصور.
أصل
الأصل هو موضع النواة الذي يقع فوق (مفهوميًا) بكسل الإخراج الحالي. قد يكون هذا خارج النواة الفعلية، على الرغم من أنه يتوافق عادةً مع أحد عناصر النواة. بالنسبة للنواة المتماثلة، يكون الأصل عادةً هو العنصر المركزي.
التفاف

الالتفاف هو عملية إضافة كل عنصر من الصورة إلى جيرانه المحليين، مع ترجيحه بالنواة. ويرتبط هذا بشكل من أشكال الالتفاف الرياضي . إن عملية المصفوفة التي يتم إجراؤها - الالتفاف - ليست عملية ضرب مصفوفة تقليدية، على الرغم من الإشارة إليها أيضًا بواسطة *.
على سبيل المثال، إذا كان لدينا مصفوفتان من ثلاثة إلى ثلاثة، الأولى نواة والثانية جزء من صورة، فإن الالتفاف هو عملية قلب كل من الصفوف والأعمدة للنواة وضرب الإدخالات المتشابهة محليًا والجمع. سيكون العنصر عند الإحداثيات [2، 2] (أي العنصر المركزي) للصورة الناتجة عبارة عن تركيبة مرجحة لجميع إدخالات مصفوفة الصورة، مع الأوزان المعطاة بواسطة النواة:
سيتم ترجيح الإدخالات الأخرى بشكل مماثل، حيث نضع مركز النواة على كل نقطة حدودية للصورة، ونحسب مجموعًا مرجحًا.
يتم حساب قيم بكسل معين في الصورة الناتجة عن طريق ضرب كل قيمة أساسية بقيم بكسل الصورة المدخلة المقابلة. ويمكن وصف ذلك خوارزميًا باستخدام الكود الزائف التالي:
لكل صف صورة في الصورة المدخلة :
لكل بكسل في صف الصورة :
ضبط البطارية على الصفر
لكل صف kernel في kernel :
لكل عنصر في صف kernel :
إذا كان موضع العنصر مطابقًا لموضع البكسل ،
فاضرب قيمة العنصر المقابلة لقيمة البكسل
وأضف النتيجة إلى المجمع
.
تعيين بكسل الصورة الناتجة إلى المجمع
- *يتم العثور على بكسلات الصورة المدخلة المقابلة بالنسبة إلى أصل النواة.
إذا كانت النواة متماثلة، فضع مركز (أصل) النواة على البكسل الحالي. ستتداخل النواة مع البكسلات المجاورة حول الأصل. يجب ضرب كل عنصر نواة بقيمة البكسل التي تتداخل معها ويجب جمع كل القيم التي تم الحصول عليها. سيكون هذا المجموع الناتج هو القيمة الجديدة للبكسل الحالي المتداخل حاليًا مع مركز النواة.
إذا لم تكن النواة متماثلة، فيجب قلبها حول محورها الأفقي والرأسي قبل حساب الالتفاف كما هو موضح أعلاه. [1]
الشكل العام لالتواء المصفوفة هو
التعامل مع الحافة

تتطلب عملية التفاف النواة عادةً قيمًا من وحدات البكسل خارج حدود الصورة. هناك مجموعة متنوعة من الطرق للتعامل مع حواف الصورة.
- يمتد
- يتم تمديد وحدات البكسل الحدودية الأقرب مفهوميًا بقدر ما هو ضروري لتوفير قيم للالتفاف. يتم تمديد وحدات البكسل الزاوية في أسافين بزاوية 90 درجة. يتم تمديد وحدات البكسل الحافة الأخرى في خطوط.
- طَوّق
- يتم تغليف الصورة مفاهيميًا (أو تقسيمها إلى بلاط) ويتم أخذ القيم من الحافة أو الزاوية المقابلة.
- مرآة
- تنعكس الصورة مفهوميًا عند الحواف. على سبيل المثال، عند محاولة قراءة بكسل 3 وحدات خارج الحافة، يتم قراءة 3 وحدات داخل الحافة بدلاً من ذلك.
- قص / تجنب التداخل
- يتم تخطي أي بكسل في الصورة الناتجة والذي يتطلب قيمًا من خارج الحافة. يمكن أن تؤدي هذه الطريقة إلى أن تكون الصورة الناتجة أصغر قليلاً، مع اقتصاص الحواف. حرك النواة بحيث لا تكون هناك حاجة أبدًا إلى قيم من خارج الصورة. يستخدم التعلم الآلي هذا النهج بشكل أساسي. مثال: حجم النواة 10x10، حجم الصورة 32x32، الصورة الناتجة 23x23.
- محصول النواة
- لا يتم استخدام أي بكسل في النواة يمتد بعد صورة الإدخال ويتم ضبط التطبيع للتعويض.
- ثابت
- استخدم قيمة ثابتة للبكسلات خارج الصورة. عادةً ما يتم استخدام اللون الأسود أو الرمادي في بعض الأحيان. يعتمد هذا بشكل عام على التطبيق.
تطبيع
يتم تعريف التطبيع على أنه تقسيم كل عنصر في النواة على مجموع كل عناصر النواة، بحيث يكون مجموع عناصر النواة الطبيعية يساوي الواحد. سيضمن هذا أن يكون متوسط البكسل في الصورة المعدلة بنفس سطوع متوسط البكسل في الصورة الأصلية.
تحسين
تتضمن خوارزميات الالتفاف السريع ما يلي:
- التفاف قابل للفصل
التفاف قابل للفصل
تتطلب عملية الالتفاف ثنائي الأبعاد باستخدام نواة M × N مضاعفات M × N لكل عينة (بكسل). إذا كانت النواة قابلة للفصل، فيمكن تقليل الحساب إلى مضاعفات M + N. يمكن أن يؤدي استخدام الالتفافات القابلة للفصل إلى تقليل الحساب بشكل كبير عن طريق إجراء الالتفاف أحادي البعد مرتين بدلاً من الالتفاف ثنائي الأبعاد مرة واحدة. [2]
تطبيق
فيما يلي تنفيذ التفافي ملموس تم إجراؤه باستخدام لغة التظليل GLSL :
// المؤلف : csblo
// تم إنجاز العمل فقط من خلال استشارة :
// https://en.wikipedia.org/wiki/Kernel_(image_processing)
// تعريف النوى
# تعريف الهوية mat3(0, 0, 0, 0, 1, 0, 0, 0, 0) #
تعريف الحافة0 mat3(1, 0, -1, 0, 0, 0, -1, 0, 1) #
تعريف الحافة1 mat3(0, 1, 0, 1, -4, 1, 0, 1, 0) #
تعريف الحافة2 mat3(-1, -1, -1, -1, 8, -1, -1, -1, -1)
# تعريف شحذ mat3(0, -1, 0, -1, 5, -1, 0, -1, 0) #
تعريف مربع التمويه mat3(1, 1, 1, 1, 1, 1, 1, 1, 1) * 0.1111 #
تعريف التمويه الغاوسي mat3(1, 2, 1, 2، 4، 2، 1، 2، 1) * 0.0625
#تعريف النقش البارز mat3(-2، -1، 0، -1، 1، 1، 0، 1، 2)
// ابحث عن إحداثيات عنصر المصفوفة من الفهرس
vec2 kpos ( int index ) { return vec2 [ 9 ] ( vec2 ( - 1 , - 1 ), vec2 ( 0 , - 1 ), vec2 ( 1 , - 1 ), vec2 ( - 1 , 0 ), vec2 ( 0 , 0 ), vec2 ( 1 , 0 ), vec2 ( - 1 , 1 ), vec2 ( 0 , 1 ), vec2 ( 1 , 1 ) )[ index ] / iResolution . xy ; }
// استخراج منطقة البعد 3x3 من العينة التي تركز على uv
// sampler: عينة نسيج
// uv: الإحداثيات الحالية على العينة
// return: مجموعة من mat3، كل مؤشر يتوافق مع قناة اللون
mat3 [ 3 ] region3x3 ( sampler2D sampler , vec2 uv ) { // إنشاء كل بكسل للمنطقة vec4 [ 9 ] region ; for ( int i = 0 ; i < 9 ; i ++ ) region [ i ] = texture ( sampler , uv + kpos ( i ));
// إنشاء منطقة 3x3 مع 3 قنوات ألوان (أحمر، أخضر، أزرق)
mat3 [ 3 ] mRegion ؛ for ( int i = 0 ؛ i < 3 ؛ i ++ ) mRegion [ i ] = mat3 ( region [ 0 ][ i ]، region [ 1 ][ i ]، region [ 2 ][ i ]، region [ 3 ][ i ] ، region [ 4 ][ i ]، region [ 5 ][ i ]، region [ 6 ][ i ]، region [ 7 ][ i ]، region [ 8 ][ i ] )؛ return mRegion ؛ }
// التفاف نسيج مع kernel
// kernel: kernel المستخدم للالتفاف
// sampler: texture sampler
// uv: الإحداثيات الحالية على sampler
التفاف vec3 ( mat3 kernel ، sampler2D sampler ، vec2 uv ) { شظية vec3 ؛ // استخراج منطقة 3x3 مركزها uv mat3 [ 3 ] region = region3x3 ( sampler ، uv )؛ // لكل قناة لون من المنطقة for ( int i = 0 ؛ i < 3 ؛ i ++ ) { // الحصول على قناة المنطقة mat3 rc = region [ i ]؛ // ضرب مكون kernel في قناة المنطقة mat3 c = matrixCompMult ( kernel ، rc )؛ // أضف كل مكون من مكونات مصفوفة التعويم r = c [ 0 ][ 0 ] + c [ 1 ][ 0 ] + c [ 2 ][ 0 ] + c [ 0 ][ 1 ] + c [ 1 ][ 1 ] + c [ 2 ][ 1 ] + c [ 0 ][ 2 ] + c [ 1 ][ 2 ] + c [ 2 ][ 2 ]; // بالنسبة للجزء الموجود في القناة i، اضبط النتيجة segment [ i ] = r ; } return segment ; }
void mainImage ( out vec4 fragColor , in vec2 fragCoord ) { // إحداثيات البكسل الطبيعية (من 0 إلى 1) vec2 uv = fragCoord / iResolution . xy ; // التفاف النواة مع الملمس vec3 col = convolution ( emboss , iChannel0 , uv ); // إخراج إلى الشاشة fragColor = vec4 ( col , 1.0 ); }
انظر أيضا
مراجع
- ^ "مثال على الالتفاف ثنائي الأبعاد".
- ^ "Convolution". www.songho.ca . تم الاسترجاع في 2022-11-19 .
مصادر
- لودفيج، جيمي (بدون تاريخ). التفاف الصور (PDF) . جامعة بورتلاند الحكومية.
- Lecarme, Olivier; Delvare, Karine (January 2013). كتاب GIMP: دليل كامل لكل شيء تقريبًا . No Starch Press. ص. 429. ISBN 978-1593273835.
- جومستر، جيسون فان؛ شيمونسكي، روبرت (مارس 2012). GIMP Bible . John Wiley & Sons. ص 438-442. ISBN 978-0470523971.
- Shapiro, Linda G .; Stockman, George C. (فبراير 2001). Computer Vision . Prentice Hall. ص 53-54. ISBN 978-0130307965.
روابط خارجية
- تنفيذ الالتفاف ثنائي الأبعاد على FPGA
- دليل برمجة vImage: إجراء عمليات الالتفاف
- معالجة الصور باستخدام تقنية 2D-Convolution
- برنامج معالجة الصور GNU - دليل المستخدم - 8.2. مصفوفة الالتفاف
- عرض توضيحي لنوى الالتفاف 3x3 باستخدام GLSL
- مشروع مفتوح المصدر كامل بلغة C++








