- 1. تحويلات الصور - التحول التقريبي وغير الأفيني
- 2. ترجمات الصور - تحريك الصورة لأعلى ولأسفل ولليسار ولليمين
- 3. دوران الصورة - تدوير الصورة
- 4. التحجيم ، التحجيم والاستيفاء
- 5. أهرامات الصور - طريقة أخرى لتغيير الحجم
- 6. اقتصاص - قطع منطقة الصورة التي تريدها
- 7. العمليات الحسابية لتفتيح وتغميق الصور
في البرنامج التعليمي السابق، تعلمناه عن مكتبة برمجية مفتوحة للرؤية الحاسوبية وفعل بعض الصور الأساسية تجهيز استخدامه مثل التحجيم الرمادي، وتشبع اللون والرسم البياني، ومساحات اللون، مكون RGB الخ كما قال في البرنامج التعليمي السابق، مكتبة برمجية مفتوحة للرؤية الحاسوبية هو المصدر المفتوح المسافر الرؤية مكتبة التي لديها واجهات C ++ و Python و Java وتدعم أنظمة التشغيل Windows و Linux و Mac OS و iOS و Android. لذلك يمكن تثبيته بسهولة في Raspberry Pi مع بيئة Python و Linux. ويمكن استخدام Raspberry Pi مع OpenCV والكاميرا المرفقة لإنشاء العديد من تطبيقات معالجة الصور في الوقت الفعلي مثل اكتشاف الوجه وقفل الوجه وتتبع الكائن واكتشاف لوحة أرقام السيارة ونظام أمن المنزل وما إلى ذلك.
في هذا البرنامج التعليمي ، سنرى كيف سنقوم بمعالجة الصورة باستخدام OpenCV. هنا سوف نتعلم كيفية تطبيق الوظيفة التالية على صورة باستخدام OpenCV:
- تحولات الصور - التحول التقريبي وغير المتفرغ
- ترجمات الصور - تحريك الصورة لأعلى ولأسفل ولليسار ولليمين
- دوران الصورة - تدوير الصورة
- التحجيم وتغيير الحجم والاستيفاء
- أهرامات الصور - طريقة أخرى لتغيير الحجم
- الاقتصاص - قطع منطقة الصورة التي تريدها
- العمليات الحسابية لتفتيح وتغميق الصور
1. تحويلات الصور - التحول التقريبي وغير الأفيني
التحولات عبارة عن تشوهات هندسية يتم إجراؤها على صورة ما ، والتشوهات بالتأكيد هنا لا تعني الأخطاء ولكن نوع التصحيح لتصحيح مشكلات المنظور الناشئة عن النقطة التي تم التقاط الصورة فيها. هناك نوعان من تحويلات الصور - أفيني وغير ذي صلة
التحولات التقريبية هي من ثلاثة أنواع من التحجيم والتناوب والترجمة ، والشيء المهم في التحويلات الأفينية هو أن الخطوط متوازية قبل وبعد تحويلات الصورة.
لا تحافظ التحويلات غير المرتبطة أو التحويلات الإسقاطية على التوازي أو الطول أو الزاوية ، ولكنها تحافظ على العلاقة الخطية المتداخلة والوقوع ، وتعني العلاقة الخطية المتداخلة أن النقطتين تقعان على نفس الخط المستقيم.
تعد التحولات غير المرتبطة شائعة جدًا في رؤية الكمبيوتر ويتم إنشاؤها من زوايا مختلفة للكاميرا. تسمى التحولات غير الأفينية أو الإسقاطية أيضًا التماثل.
2. ترجمات الصور - تحريك الصورة لأعلى ولأسفل ولليسار ولليمين
تقوم ترجمة الصور بتحريك الصورة لأعلى ولأسفل ولليسار ولليمين وحتى قطريًا إذا قمنا بتنفيذ ترجمة x و y في نفس الوقت.
الآن لإجراء ترجمات للصور ، نستخدم وظيفة warpAffine في opencv ، يتم استخدام cv2.warpAffine لتنفيذ هذه الترجمات ولكن من أجل ذلك نحتاج إلى مصفوفة ترجمة.
مصفوفة الترجمة ،
T = 1 0 Tx
0 1 ty
T X ، T y هي الاتجاهات التي تحدث فيها إزاحة الصورة.
حيث يتم تحويل T X على طول المحور X (أفقيًا)
T Y يتحول على طول المحور Y (عموديًا)
# هذا تحويل أفيني يغير ببساطة موضع الصورة # نستخدم cv2.warpAffine لتنفيذ هذه التحولات. استيراد cv2 استيراد numpy كـ np image = cv2.imread ('input.jpg') # تخزين ارتفاع وعرض ارتفاع الصورة ، العرض = image.shape print (image.shape) quater_height، quater_width = height / 4، width / 4 T = np.float32 (،]) img_translation = cv2.warpAffine (image، T، (width، height)) print (T) cv2.imshow ('original_image'، image) cv2.waitKey (0) cv2.imshow (' ترجمة '، img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
خرج وحدة التحكم - (183 ، 275) - الارتفاع والعرض
- مصفوفة T.
]
3. دوران الصورة - تدوير الصورة
تدوير الصورة هو تدوير الصورة حول نقطة أو نقطة في مركز الصورة ، تمامًا كما تعمل نقطة الدوران كمحور.
كما هو الحال في الترجمة ، لدينا مصفوفة T ، ومن المحتمل أن يكون لدينا أثناء الدوران مصفوفة M.
مصفوفة الدوران ، مصفوفة M = Cosθ -Sinθ
سينو كوزو
حيث θ هي زاوية الدوران ، مقاسة في اتجاه عكس عقارب الساعة.
هناك أيضًا شيء واحد يجب ملاحظته وهو أن OpenCV يتيح لك بيع الصورة وتدويرها في نفس الوقت باستخدام الوظيفة ، cv2.getRotationMatrix2D (rotation_center_x ، rotation_center_y ، زاوية الدوران ، المقياس)
ما زلنا نستخدم وظيفة warpAffine في opencv للحصول على دوران الصورة ولكن بدلاً من مصفوفة الترجمة كما في الحالة السابقة هنا نستخدم مصفوفة الدوران.
استيراد cv2 استيراد numpy كـ np image = cv2.imread ('input.jpg') height، width = image.shape # اقسم الارتفاع والعرض بمقدار 2 لتدوير الصورة حول مركزها rotation_matrix = cv2.getRotationMatrix2D ((العرض / 2 ، height / 2)، 90،1) rotated_image = cv2.warpAffine (image، rotation_matrix، (width، height)) cv2.imshow ('original image'، image) cv2.waitKey (0) cv2.imshow ('تدوير الصورة '، rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
الآن يتم تدوير الصورة بمقدار 90 درجة ، يتم اقتصاصها بسبب حجم اللوحة القماشية ، نظرًا لأن حجم اللوحة القماشية يظل كما هو ولكن نظرًا لأن حجم الصورة التدوير لا يتناسب مع حجم اللوحة القماشية. يمكن ضبطه عن طريق ضبط عامل التحجيم على سلبي ، لكنه يسمح بخلفية سوداء خلف الصورة.
لذلك يمكنك ضبط ارتفاع وعرض الصورة عن طريق توقعها أو تخمينها أو أن هناك طريقة أخرى لتدوير الصورة عن طريق نقلها ، ولكنها ستدور الصورة بمضاعفات 90 درجة في اتجاه عكس عقارب الساعة.
4. التحجيم ، التحجيم والاستيفاء
التحجيم وتغيير الحجم عبارة عن تحولات أفينية ، وتغيير حجم الصورة هو ما فعلناه منذ وقت طويل وقد تعاملنا أيضًا مع الاستيفاء ، مثل عندما تقوم بتغيير حجم الصورة إلى حجم أكبر حيث نقوم بتوسيع وحدات البكسل ، توجد بعض الفجوات في بكسل وهنا يأتي الاستيفاء.
يمكن أن يحدث عند زيادة حجم الصورة من الأصغر إلى الأكبر أو تقليل حجم الصورة من الأكبر إلى الأصغر.
من الناحية الفنية ، يعد الاستيفاء طريقة لإنشاء نقاط بيانات جديدة (وحدات بكسل) ، ضمن مجموعة منفصلة من نقاط البيانات المعروفة.
هناك أنواع مختلفة من طرق الاستيفاء في OpenCV مثل
cv2.INTER_AREA - جيد لتقليص العينات أو تصغيرها
cv2.INTER_NEAREST - الأسرع
cv2.LINEAR - جيدة للتكبير أو التصغير لأخذ العينات (افتراضي)
cv2.CUBIC - أفضل
cv2.INTER_LANCZOS4 - الأفضل
# تغيير الحجم سهل للغاية باستخدام وظيفة cv2.resize ، وسيطاتها هي # cv2.resize (صورة ، dsize (حجم صورة الإخراج) ، x_scale ، y_scale ، الاستيفاء) استيراد cv2 numpy كـ np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image '، image) cv2.waitKey (0) # لنجعل الصورة 3/4 الحجم الأصلي للصورة ، أي يتدرج حجم الصورة إلى 75٪ image_scaled = cv2.resize (image ، None ، fx = 0.75، fy = 0.75) # نظرًا لأن الاستيفاء الخطي هو الطريقة الافتراضية للسيرة الذاتية المفتوحة ، فلا نحتاج إلى تنفيذها كوظيفة. cv2.imshow ('scaling_linear interpolation'، image_scaled) cv2.waitKey (0) # لنضاعف حجم صورتنا img_double = cv2.resize (image، None، fx = 2، fy = 2، interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation'، img_double) cv2.waitKey (0) # لنقم بتغيير الحجم بالأبعاد الدقيقة image_resize = cv2.resize (image، (200،300)، interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact'، image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. أهرامات الصور - طريقة أخرى لتغيير الحجم
تشير الصورة الهرمية إلى إما تكبير (تكبير الصور) أو تصغير الحجم (تقلص الصور).
إنها ببساطة طريقة مختلفة لتغيير الحجم تسمح لنا بقياس الصور بسهولة وسرعة ، مما يقلل من ارتفاع وعرض الصورة الجديدة بمقدار النصف.
يكون هذا مفيدًا عند عمل أجهزة الكشف عن الكائنات التي تقيس الصور في كل مرة تبحث فيها عن كائن.
استيراد cv2 image = cv2.imread ('input.jpg') أصغر = cv2.pyrDown (صورة) أكبر = cv2.pyrUp (أصغر) cv2.imshow ('original'، image) cv2.waitKey (0) cv2.imshow ("أصغر، أصغر) cv2.waitKey (0) cv2.imshow (، وأكبر)" أكبر " cv2.waitKey (0) cv2.destroyAllWindows ()
في الصورة الأكبر ستلاحظ أنه لا يزال من نفس حجم الصورة الأصلية ضبابي قليلاً لأنه يتم تحويلها من صورة أصغر إلى صورة أكبر مباشرة. ولكن إذا أقحمناها ، فستتحسن جودة الصورة مقارنة بالجودة السابقة لأن الاستيفاء يقدّر وحدات البكسل أثناء ملء الفراغات عند تكبير الصورة.
الآن تشغيل نفس الكود ولكن مع الاستيفاء المكعب يعطي جودة أفضل للصورة الكبيرة. تُظهر الصور أدناه المقارنة بين الصورة الأصلية ، والإصدار المكبر للصورة ، والصورة الأصغر ، والإصدار المكعب المكعب للصورة الأصغر.
استيراد cv2 image = cv2.imread ('input.jpg') أصغر = cv2.pyrDown (صورة) أكبر = cv2.pyrUp (أصغر) cv2.imshow ('original'، image) cv2.waitKey (0) cv2.imshow ("أصغر، أصغر) cv2.waitKey (0) cv2.imshow ('أكبر'، أكبر) cv2.waitKey (0) # زيادة نوعية تحويلها بشكل اكبر من صورة أصغر باستخدام مكعب الاستيفاء img_double = cv2.resize (أصغر، لا شيء ، fx = 2 ، fy = 2 ، الاستيفاء = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation'، img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
ملاحظة: إذا كنت ترغب في إنشاء نسخ صغيرة متعددة من الصور الذهاب أصغر وأصغر في الحجم أو عدة نسخ كبيرة من الصور تزايد مستمر في حجم، ثم يمكننا استخدام لل حلقات أو حين حلقات حفظ داخل pyrDown أو pyrUp وظيفة.
6. اقتصاص - قطع منطقة الصورة التي تريدها
يشير قص الصور إلى استخراج جزء من الصورة.
لا تحتوي OpenCV مباشرة على وظيفة الاقتصاص ولكن يمكن إجراؤها بسهولة عن طريق numpy باستخدام الكود أدناه
اقتصاص = الصورة
نضع مصفوفة الصور وباستخدام أدوات أو طريقة الفهرسة في numpy ، نحدد صف البداية إلى الصف الأخير وعمود البداية إلى نهاية العمود مفصولة بفاصلة تستخرج المستطيل الذي نريد اقتصاصه للحصول على الصورة.
استيراد cv2 استيراد numpy كـ np image = cv2.imread ('input.jpg') height، width = image.shape # لنحصل على إحداثيات بكسل البداية (أعلى يسار مستطيل الاقتصاص) start_row، start_col = int (الارتفاع *.25) ، int (width *.25) # لننهي إحداثيات البكسل (أسفل اليمين) end_row، end_col = int (height *.75)، int (width *.75) # ببساطة استخدم الفهرسة لاقتصاص المستطيل الذي نريد اقتصاصه = image cv2.imshow ("original image"، image) cv2.waitKey (0) cv2.imshow ("اقتصاص الصورة" ، اقتصاصها) cv2.waitKey (0) cv2.destroyAllWindows ()
لاحظ أنه يمكنك استخدام قيم البكسل مباشرةً بدلاً من start_col أو start_row ، حيث يتم منحها فقط للحصول على تعريف سهل للمستخدم.
7. العمليات الحسابية لتفتيح وتغميق الصور
العمليات الحسابية في OpenCV هي في الأساس إضافة أو طرح مصفوفات إلى الصورة ، إضافة أو طرح المصفوفات له تأثير على زيادة أو تقليل السطوع.
لذلك لإضافة أو طرح مصفوفات ، يجب علينا إنشاء المصفوفات ، ولدى numpy وظيفة تسمى np.ones والتي تعطي مصفوفات بحجم 1 نفسه لصورتنا .
استيراد cv2 استيراد numpy كـ np image = cv2.imread ('input.jpg') # إنشاء مصفوفة من واحد ، ثم ضربها بمقياس 100 ' # np.ones يعطي مصفوفة بنفس البعد مثل صورتنا مع الكل تكون القيم 100 في هذه الحالة M = np.ones (image.shape، dtype = "uint8") * 100 # نستخدم هذا لإضافة هذه المصفوفة M إلى صورتنا # لاحظ الزيادة في السطوع المضافة = cv2.add (صورة ، M) cv2.imshow ("مضاف" ، مضاف) cv2.waitKey (0) #likewise يمكننا أيضًا استبدال # لاحظ انخفاض السطوع مطروح = cv2.subtract (صورة ، M) cv2.imshow ("مطروح" ، مطروح) cv2.waitKey (0) cv2.destroyAllWindows ()
هذه هي الطريقة التي يمكن بها استخدام OpenCV لتطبيق العديد من عمليات معالجة الصور المختلفة على الصورة. سنستمر مع وظائف معالجة الصور الأخرى في البرنامج التعليمي التالي.