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

  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...')

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

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

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

Download “دانلود سورس الگوریتم فیلتر میانه در پایتون”

Median-filter-in-python-www.codegate.ir_.zip – 178 بار دانلود شده است – 117,66 کیلوبایت

پسورد: www.codegate.ir

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