اذهب إلى المحتوى
  • 0

تطبيع الصورة Normalizing باستخدام opencv في بايثون

Ali Ismael

السؤال

أقوم بعملية تطبيع Normalizing للصورة  باستخدام الدالة cv2.normalize  لتغيير نطاق قيم كثافة البكسل (أريد جعلها بين ال 0 وال 1)، وقمت بتطبيق خوارزمية NORM_L1 لكن لم ينجح الأمر؟ وتظهر الصورة سوداء بقيم صفرية.

import cv2
import Image
import numpy
myimage = cv2.imread('/content/test5 openeye.jpg',0)
img_normlaized=cv2.normalize(myimage,None,alpha=0,beta=1,norm_type=cv2.NORM_L1)
image = Image.fromarray(img_normlaized)
image.save("image.jpg")

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

إذا أردت زيادة وضوح الصورة والتخلص من بعض الضجيج ( تحسينها بشكل عام ) قم بضبط  ألفا (القيمة الدنيا للبكسل على 0) والعليا على 255.  حيث أن هذين ال%D

إذا أردت زيادة وضوح الصورة والتخلص من بعض الضجيج ( تحسينها بشكل عام ) قم بضبط  ألفا (القيمة الدنيا للبكسل على 0) والعليا على 255.  حيث أن هذين الوسيطين يمثلان القيم العليا والدنيا لبكسلات الصورة الناتجة. والقيم الناتجة للبكسلات ستكون من النمط unit8 أي أعداد صحيحة ب 8 بت ضمن المجال من 0 ل 255.  واستخدم إحدى خوارزميات التطبيع (norm_type) مثل: cv.NORM_INF -  cv.NORM_L1 - cv.NORM_L2 -  cv.NORM_MINMAX. أما في حالة أردت تغيير نطاق قيم كثافة البكسل (حالتك) فيجب وضع القيم العليا والدنيا ضمن المجال الذي تحتاجه وفي حالتك يجب أن تضعهم على 0 و 1 لكن هذا سينتج مصفوفة بقيم صفرية لأن نمط الخرج سيكون unit8 لذا يجب تغيير نمط الإخراج وجعله float لذا يجب أن تقوم باستخدام وسيط إضافي هو dtype وضبطه على cv2.CV_32F.  ,وقم باستخدام خوارزمية cv2.NORM_MINMAX لذا لحل مشكلتك:

myimage = cv2.imread('/content/test5 openeye.jpg',0)
img_normlaized=cv2.normalize(myimage,None,alpha=0,beta=1,norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
img_normlaized

والنتيجة:

array([[0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 ,
        0.5179283 ],
       [0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 ,
        0.5179283 ],
       [0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 ,
        0.5179283 ],
       ...,
       [0.44621515, 0.44621515, 0.44621515, ..., 0.45019922, 0.45019922,
        0.45019922],
       [0.44621515, 0.44621515, 0.44621515, ..., 0.44621515, 0.44621515,
        0.44621515],
       [0.44621515, 0.44621515, 0.44621515, ..., 0.44621515, 0.44621515,
        0.44621515]], dtype=float32)
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في البداية دعنا نفهم كيف تعمل L1-NORM حتى نرى اذا كان مناسبا لما تريد أم لا.

L1 تقوم بجعل قيم البيكسل للصورة بين 0 و 1 عن طريق المعادلة التالية:

l1.PNG.18ed83561af12cf1e9d4cf9f3dcbc5f2.PNG

بينما في L2 تقوم ايضا بجعل القيم بين 0 و 1 لكن بمعادلة مختلفة وهي جذر مربع القيم كالتالي:

l2.PNG.3fc08e3df8d0c09bf8343352a827c3b5.PNG

ويمكنك تطبيق احداهما يدويا على الصور في بايثون، اما عن طريقة استخدام ال normalization في opencv فهي كالتالي:

#استدعاء المكتبات
import cv2 as cv
import numpy as np
#قراءة الصورة
img = cv.imread('city.jpeg')
norm_img = np.zeros((800,800))
#تعديل أبعاد الصورة باستخدام normalize
final_img = cv.normalize(img,  norm_img, 0, 255, cv.NORM_MINMAX)
#حفظ الصورة
cv.imwrite('city_normalized.jpg', final_img)
cv.waitKey(0)
cv.destroyAllWindows()

الصورة الأصلية:

city.jpeg.5b24b5d7916b6ca24b8811c1a3392dcc.jpeg

بعد عمل normalization:

city_normalized.jpg.0e39fc526be82ad8c7f4b71d69303cf0.jpg

ويمكنك استخدام cv.NORM_L1 أو cv.NORM_L2 بدلا من cv.NORM_MINMAX 

.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...