image processing, python, پایتون, پردازش تصویر, پردازش تصویر در پایتون

الگوریتم فیلتر میانه در پایتون (Median Filter)

الگوریتم فیلتر میانه در پایتون

در این جلسه تیم کدگیت را با یکی دیگر از آموزش‌های پردازش تصویر یعنی « الگوریتم فیلتر میانه در پایتون » همراهی کنید. قبل از شروع آموزش طبق روال آموزش‌های گذشته پیش‌نیازهای این جلسه را معرفی می‌کنیم. پیش‌نیاز‌ها به صورت زیر است:

  1. خواندن تصاویر در پایتون
  2. حلقه For در پایتون
  3. لیست در پایتون
  4. فیلتر میانگین در پایتون
  5. فیلتر نقطه میانی در پایتون

میانه چیست؟

میانه، عدد وسط مجموعه‌ای از اعداد مرتب است و به دو صورت زیر محاسبه می‌شود:

  1. تعداد اعداد مجموعه زوج باشد: میانگین دو عدد وسط را میانه می‌گویند.
  2. تعداد اعداد مجموعه فرد باشد: عدد وسط مجموعه را میانه تعریف می‌کنند.

به عنوان مثال مجموعه مرتب زیر را ببینید:

9, 12, 14, 17, 19, 22, 25

تعداد اعداد 7 است(فرد است) پس میانه عدد وسط یعنی عدد 17 می‌شود. به عنوان مثال دوم میانه مجموعه زیر را پیدا کنید:

8, 12, 14, 17, 21, 23, 25, 30

تعداد اعداد 8(زوج است) است پس میانه برابراست با میانگین دو عدد وسط یعنی 2/(17+21).

همسایه یک پیکسل در تصاویر

همانطور که در آموزش‌های گذشته گفته شد تصاویر از پیکسل‌ها تشکیل شده و نحوه نمایش آنها به صورت آرایه دو بعدی است(البته تصاویر RGB سه آرایه دو بعدی داریم!). به تصویر زیر دقت کنید:

 در تصویر بالا همسایگان پیکسل X و Y را نمایش دادیم. این نمایش را نمایش همسایگان 8 تایی یک پیکسل تعریف می‌کنند. همسایه 4 تایی یک پیکسل به صورت زیر نمایش داده می‌شود:

الگوریتم فیلتر میانه در پایتون

فیلتر میانگین یک فیلتر غیرخطی است، که یک همسایگی اطراف پیکسل را در نظر می‌گیرد و میانه اعداد موجود در آن همسایگی را به عنوان مقدار پیکسل جدید در نظر می‌گیرد. به تصویر زیر دقت کنید:

می‌خواهیم فیلتر میانه بر روی پیکسل وسط (عدد 15 تصویر بالا) محاسبه کنیم ابتدا تمامی همسایه‌ها و خود پیکسل  را به صورت مرتب در آورده و سپس میانه آنها را محاسبه می‌کنیم. در تصویر بالا عدد 9 عدد وسط است(خانه چهارم) پس میانه ما نیز 9 می‌شود(تعداد اعداد مجموعه ما فرد است) پس مقدار 9 جایگزین 15 می‌شود(به همین سادگی!). همین کار را برای تمامی پیکسل‌ها انجام می‌دهیم.

برای سادگی کار ما مرز یک تصویر را در نظر نمی‌گیریم اما راه‌حل‌های مختلفی وجود دارد که این مشکل را برطرف کرده است.

پیاده سازی الگوریتم فیلتر میانه در پایتون

پیاده‌سازی الگوریتم فیلتر میانه در پایتون بسیار ساده است. ابتدا یک تصویر رنگی را می‌خوانیم. سپس برای تمامی پیکسل‌های آن موارد زیر را اعمال می‌کنیم:

  1. سه لیست به طول 9 ایجاد می‌کنیم(لیست‌ها برای ذخیره R و G و B است).
  2. برای پیکسل X و Y، پیکسل‌های R و G و B همسایه 8 تایی و خود X و Y را درون لیست خود(لیست‌های مورد 1) میریزیم.
  3. لیست‌های خود را مرتب می‌کنیم.
  4. مقدار پیکسل جدید، مقدار خانه چهارم لیست‌های R و G و B است.
  5. موارد فوق را برای تمام پیکسل‌های تصویر انجام می‌دهیم.

کد الگوریتم فیلتر میانه در پایتون به صورت زیر است:

from PIL import Image
def medianFilter (sourceAddress, destAddress):
    source = Image.open(sourceAddress)
    result = Image.new('RGB', source.size)
    
    width, height = source.size
    pixels = result.load()
    
    for i in range(1, width - 1, 1):
        for j in range(1, height - 1, 1):
            medianRed = findMedianRed(source, i, j)
            medianGreen = findMedianGreen(source, i, j)
            medianBlue = findMedianBlue(source, i, j)
            pixels[i, j] = (medianRed, medianGreen, medianBlue, 255)
    
    result.save(destAddress, "JPEG")
    
def findMedianRed(source, x, y):
    neighbour = [00] * 9
    neighbour[00] = source.getpixel((x - 1, y - 1))[00]
    neighbour[1] = source.getpixel((x + 1, y + 1))[00]
    neighbour[2] = source.getpixel((x, y - 1))[00]
    neighbour[3] = source.getpixel((x, y + 1))[00]
    neighbour[4] = source.getpixel((x - 1, y))[00]
    neighbour[5] = source.getpixel((x + 1, y))[00]
    neighbour[6] = source.getpixel((x - 1, y + 1))[00]
    neighbour[7] = source.getpixel((x + 1, y - 1))[00]
    neighbour[8] = source.getpixel((x, y))[00]
    neighbour.sort()
    return  neighbour[4]
def findMedianGreen(source, x, y):
    neighbour = [00] * 9
    neighbour[00] = source.getpixel((x - 1, y - 1))[1]
    neighbour[1] = source.getpixel((x + 1, y + 1))[1]
    neighbour[2] = source.getpixel((x, y - 1))[1]
    neighbour[3] = source.getpixel((x, y + 1))[1]
    neighbour[4] = source.getpixel((x - 1, y))[1]
    neighbour[5] = source.getpixel((x + 1, y))[1]
    neighbour[6] = source.getpixel((x - 1, y + 1))[1]
    neighbour[7] = source.getpixel((x + 1, y - 1))[1]
    neighbour[8] = source.getpixel((x, y))[1]
    neighbour.sort()
    return  neighbour[4] 
def findMedianBlue(source, x, y):
    neighbour = [00] * 9
    neighbour[00] = source.getpixel((x - 1, y - 1))[2]
    neighbour[1] = source.getpixel((x + 1, y + 1))[2]
    neighbour[2] = source.getpixel((x, y - 1))[2]
    neighbour[3] = source.getpixel((x, y + 1))[2]
    neighbour[4] = source.getpixel((x - 1, y))[2]
    neighbour[5] = source.getpixel((x + 1, y))[2]
    neighbour[6] = source.getpixel((x - 1, y + 1))[2]
    neighbour[7] = source.getpixel((x + 1, y - 1))[2]
    neighbour[8] = source.getpixel((x, y))[2]
    neighbour.sort()
    return  neighbour[4]
if __name__ == '__main__':
    medianFilter('Median input.png', 'median filter output.jpg')
    print('convert image finished...')

خروجی کد بالا به صورت زیر است:

همانطور که در تصویر فوق می‌بینید فیلتر میانه برای نویز گیری تصاویر استفاده می‌شود.

اگر سوالی در خصوص فیلتر میانه دارید در قسمت کامنت سوال خود را مطرح کنید تا پاسخگوی شما باشیم.

نوشته های مشابه

2 دیدگاه در “الگوریتم فیلتر میانه در پایتون (Median Filter)

  1. Muuhammad Hussain Royesh گفت:

    Greetings CodeGate Academy!
    I did not uderstand
    if name== mian…
    could u please explain your code

    1. Hi. this part of code call Main Function. Like Main Method in Java. when python start to run your code search for this function to start

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *