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

إضافة ضجيج Gaussian أو salt and pepper إلى الصورة في OpenCV في بايثون

Ali Ismael

السؤال

Recommended Posts

  • 1

لا يوجد تابع جاهز. لكن المثال التالي يبين لك كيفية إضافته، فكما نعلم إن الضجيج الغاوصي هو ضوضاء أو تشويش له دالة كثافة احتمالية مساوية لدالة الكثافة الاحتمالية للتوزيع الطبيعى (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")

والنتيجة:
index.thumb.png.a43b7352aa58b30a3d9b5e15cdaab3a3.png
وهنا قمت بإنشاء تابع لك لإضافة الضجيج الغاوصي:

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

قد لا يكون هناك دوال جاهزة لمثل تلك الأنواع من الضجيج في 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()

وتكون هذه هي النتيجة:

sUjcs.png.b7a42c8df9b0b810538e961b35e1fc0f.png

ويمكنك بنفس الطريقة استخدام 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

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...