Ali Ismael نشر 24 أكتوبر 2021 أرسل تقرير نشر 24 أكتوبر 2021 أريد تطبيق الدالة SimpleBlobDetector لكنها تتعامل مع الصور ذات المجال من 0 إلى 255 أي 8bit-image فقط، ولدي صورة رمادية ممثلة ب np.array وأريد تطبيق هذه الدالة عليها، فهل هناك طريقة لكي أقوم بالتحويل بشكل فعَال؟ 1 اقتباس
1 Ali Haidar Ahmad نشر 24 أكتوبر 2021 أرسل تقرير نشر 24 أكتوبر 2021 (معدل) نعم، الحل يتجلى بعمل تقييس لبياناتك، أو ما ندعوه في علم معالجة الصورة بال 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) تم التعديل في 24 أكتوبر 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Ahmed Sharshar نشر 26 أكتوبر 2021 أرسل تقرير نشر 26 أكتوبر 2021 للتحويل بشكل بسيط يمكنك استخدام 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) اقتباس
السؤال
Ali Ismael
أريد تطبيق الدالة SimpleBlobDetector لكنها تتعامل مع الصور ذات المجال من 0 إلى 255 أي 8bit-image فقط، ولدي صورة رمادية ممثلة ب np.array وأريد تطبيق هذه الدالة عليها، فهل هناك طريقة لكي أقوم بالتحويل بشكل فعَال؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.