Ali Ismael نشر 27 أكتوبر 2021 أرسل تقرير مشاركة نشر 27 أكتوبر 2021 هل هناك دوال جاهزة في OpenCV لإضافة ضجيج مثل الضجيج الغاوصي أو ضجيج الملح والفلفل salt and pepper إلى الصورة كما في الماتلاب؟ 1 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
1 Ali Haidar Ahmad نشر 27 أكتوبر 2021 أرسل تقرير مشاركة نشر 27 أكتوبر 2021 لا يوجد تابع جاهز. لكن المثال التالي يبين لك كيفية إضافته، فكما نعلم إن الضجيج الغاوصي هو ضوضاء أو تشويش له دالة كثافة احتمالية مساوية لدالة الكثافة الاحتمالية للتوزيع الطبيعى (normal distrbution). وبالتالي يمكننا استخدام الدالة np.random.normal التي تعطي عينات عشوائية من التوزيع الطبيعي (غاوسي)، لتشكيل مصفوفة من هذه العينات (مطابقة بالحجم لحجم الصورة) ثم إضافتها إلى الصورة الأصلية ( هو ضجيج جمعي). random.normal(loc=0.0, scale=1.0, size=None) حيث نمرر للوسيط Size أبعاد الصورة نفسها، والوسيط loc يمثل الوسيط Mean أي مركز التوزيع، والوسيط scale يمثل الانحراف المعياري (الانتشار أو العرض) للتوزيع. ويجب أن تكون غير سالبة. انظر للمثال: import cv2 as cv import numpy as np import matplotlib.pyplot as plt # قراءة الصورة image=cv.imread("/content/gray.png",0) # قراءتها بالحالة الرمادية # إضافة الضجيج الغاوصي لها بشكل يدوي gauss=np.random.normal(0,1.0,image.shape).astype('uint8') gauss_image=cv.add(image,gauss) # عرض النتائج plt.figure(figsize=(25,15)) plt.subplot(131) plt.imshow(image, cmap='gray') plt.title("gray_image") plt.subplot(132) plt.imshow(gauss_image, cmap='gray') plt.title("gray_image with noise") والنتيجة: وهنا قمت بإنشاء تابع لك لإضافة الضجيج الغاوصي: import cv2 import numpy as np def gausseanNoise(image): gauss = np.random.normal(0,1.0,image.shape).astype('uint8') return cv2.add(image,gauss) وهنا تابع لإضافة ضجيج الملخ والفلفل حيث أن هذا الضجيج هو عبارة عن ثقوب بيضاء (ملح) وسوداء (فلفل) في الصورة وبالتالي أصفار و واحدات. كما تجدر الملاحظة إلى أن هذا الضجيج يطبق فقط على الصور الرمادية: import random import cv2 def s_p_noise(img): row , col = img.shape # أبعاد الصورة # اختيار بعض وحدات البكسل في الصورة عشوائياً لتلوينها باللون الأبيض number_of_pixels = random.randint(300, 10000) # بين ال 300 و 10000 وحدة for i in range(number_of_pixels): # اختيار إحداثي عيني بشكل عشوائي y_coord=random.randint(0, row - 1) # إحداثي سيني عشوائي x_coord=random.randint(0, col - 1) # جعله أبيض img[y_coord][x_coord] = 255 # الآن نفس الأمر لكن نريد الأسود number_of_pixels = random.randint(300 , 10000) for i in range(number_of_pixels): y_coord=random.randint(0, row - 1) x_coord=random.randint(0, col - 1) img[y_coord][x_coord] = 0 return img 1 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
1 Ahmed Sharshar نشر 27 أكتوبر 2021 أرسل تقرير مشاركة نشر 27 أكتوبر 2021 قد لا يكون هناك دوال جاهزة لمثل تلك الأنواع من الضجيج في opencv ، وهناك حينها طريقتان: اما عملها بشكل يدوي كما أشارت الإجابة السابقة. أو الأستعانة بمكتبات أخرى لإضافة تلك الأنواع مثل مكتبة scikit-image والتي تحوي تلك الأنواع من الضوضاء، المثال التالي يوضح كيفية استخدامها في اضافة ضوضاء جاوس: from PIL import Image import numpy as np from skimage.util import random_noise im = Image.open("test.jpg") # تحويل الصورة الى numpy im_arr = np.asarray(im) # ااضفة الضوضاء الجاوسية noise_img = random_noise(im_arr, mode='gaussian', var=0.05**2) noise_img = (255*noise_img).astype(np.uint8) img = Image.fromarray(noise_img) img.show() وتكون هذه هي النتيجة: ويمكنك بنفس الطريقة استخدام s&p من أجل ضوضاء (salt and pepper). كذكل يمكنك استخدام الدالة التالية والتي تقوم فقط فقيها بتمرير نوع الضوضاء التي تريد وهي بدورها تقوم بتطبيق هذه الضوضاء: import numpy as np import os import cv2 def noisy(noise_typ,image): if noise_typ == "gauss": row,col,ch= image.shape #ضوضاء جاوس mean = 0 #var = 0.1 #sigma = var**0.5 gauss = np.random.normal(mean,1,(row,col,ch)) gauss = gauss.reshape(row,col,ch) noisy = image + gauss return noisy elif noise_typ == "s&p": row,col,ch = image.shape s_vs_p = 0.5 amount = 0.004 out = image # Salt نظام num_salt = np.ceil(amount * image.size * s_vs_p) coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape] out[coords] = 1 # Pepper نظام num_pepper = np.ceil(amount* image.size * (1. - s_vs_p)) coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape] out[coords] = 0 return out اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
السؤال
Ali Ismael
هل هناك دوال جاهزة في OpenCV لإضافة ضجيج مثل الضجيج الغاوصي أو ضجيج الملح والفلفل salt and pepper إلى الصورة كما في الماتلاب؟
رابط هذا التعليق
شارك على الشبكات الإجتماعية
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.