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

تحويل نمط الصورة من float64 إلى uint8 في بايثون و OpenCV

Ali Ismael

السؤال

أريد تطبيق الدالة SimpleBlobDetector لكنها تتعامل مع الصور ذات المجال من 0 إلى 255 أي 8bit-image فقط، ولدي صورة رمادية ممثلة ب np.array وأريد تطبيق هذه الدالة عليها، فهل هناك طريقة لكي أقوم بالتحويل بشكل فعَال؟

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

Recommended Posts

  • 1

نعم، الحل يتجلى بعمل تقييس لبياناتك، أو ما ندعوه في علم معالجة الصورة بال normalization وهو تخفيض مجال تمثيل البيانات دون الإخلال بالمجال الديناميكي للصورة (نطاق اختلاف الدرجة اللونية بين الضوء الأفتح والأغمق في الصورة). حيث سنقوم بقسمة قيمة كل بكسل على أكبر قيمة محتملة لنوع البيانات الخاص بصورتك وهذا نحصل عليه من خلال الدالة np.iinfo التي تعطيك القيمة القصوى المحتملة (ضمن حدود الآلة الخاصة بك) لنمط البيانات. وبالتالي نحصل على صورة بقيم بين ال 0 وال 1، وبعد ذلك نقوم بضرب الناتج ب 255 وهكذا نكون حصلنا على  المطلوب، ثم يتبقى لنا الإعلان بشكل صريح عن أن المصفوفة بالنمط uint8  لذا نستخدم الدالة astype

# ..
# ..
info = np.iinfo(data.dtype)
# normalization
data = (data.astype(np.float64) / info.max)*255
img = data.astype(np.uint8)
# ..
# ..

كحل آخر،  بالنسبة لعمليةالتنعيم يمكنك استخدام الدالة cv2.normalize مع تحديد النوع NORM_MINMAX لتنفيذ خطوة ال normalization اعتماداً على استخدام معادلة الmin-max لتطبيق عملية التقييس:

zi=(xi−min(x))/(max(x)−min(x))

وبالتالي تكون خطوة التقييس:

cv2.normalize(src=image, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

للتحويل بشكل بسيط يمكنك استخدام Numpy اذا كان هناك مشاكل في استخدام opencv كالتالي:

def convert(img, target_type_min, target_type_max, target_type):
    imin = img.min()
    imax = img.max()

    a = (target_type_max - target_type_min) / (imax - imin)
    b = target_type_max - a * imax
    new_img = (a * img + b).astype(target_type)
    return new_img

حيث تقوم الدالة  بقسمة قيمة كل بكسل على أكبر قيمة موجودة لبيانات الصورة.

بعد ذلك يمكنك استخدام الدالة بسهولة هكذا:

imgu8 = convert(img16u, 0, 255, np.uint8)

اما عن استخدام SimpleBlobDetector فهو بسيط ومباشر، المثال التالي يوضح كيفية استخدامها على صورة دون أي تحويل:

import cv2
import numpy as np;

# قراءة الصورة
im = cv2.imread("blob.jpg")

# استدعاء SimpleBlobDetector .
params = cv2.SimpleBlobDetector_Params()

# تغيير قيمة العتبة
params.minThreshold = 10
params.maxThreshold = 200


# تصفية بالمساحة
params.filterByArea = True
params.minArea = 1500

# تصفية حسب الدائرية
params.filterByCircularity = True
params.minCircularity = 0.1

# تصفية حسب التحدب
params.filterByConvexity = True
params.minConvexity = 0.87

# تصفية حسب القصور الذاتي
params.filterByInertia = True
params.minInertiaRatio = 0.01

#انشاء الكاشف
detector = cv2.SimpleBlobDetector_create(params)


# تحديد blobs.
keypoints = detector.detect(im)

# رسم دوائر حمراء حولها

im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# اظهارها
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...