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

فیلتر Max در پایتون (Max Filter in Python)

فیلتر Max در پایتون

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

  1. خواندن تصاویر در پایتون

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

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

فیلتر Max در پایتون

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

فیلتر Max در پایتون

الگوریتم فیلتر Maximum

الگوریتم فیلتر Max بسیار ساده بوده و نیاز به فرمول ریاضی خاصی ندارد. با استفاده از همسایه‌های 8 تایی پیکسل X و Y، ما ماکزیمم(مقدار بیشینه) همسایگی پیکسل X  و Y را به عنوان پیکسل جدید انتخاب می‌کنیم. باید توجه کنید ما نقاط مرزی را در نظر نمی‌گیریم اما روش‌های مختلفی وجود دارد که می‌توان از آن استفاده کرد.(ما برای سادگی پیاده سازی از این پیکسل‌های مرزی صرف نظر کردیم.)

فیلتر Max در پایتون

پیاده‌سازی فیلتر Max در پایتون

برای پیاده سازی فیلتر Max در پایتون مراحل زیر را انجام می‌دهیم:

  1. یک تصویر را به عنوان ورودی دریافت می‌کنیم.
  2. تصویر ورودی را می‌خوانیم. با توجه به تصویر نیاز به سه ماکزیمم داریم. (هر پیکسل شامل سه رنگ R و G و B است)
  3. برای پیکسل X و Y، پیکسل‌های R و G و B همسایه 8 تایی و خود X و Y را درون آرایه میریزیم.
  4. با صدا زدن تابع max پیکسل ماکزیمم آرایه‌های خود را پیدا می‌کنیم.
  5. مقدار پیکسل جدید، ماکزیمم آرایه‌های R و G و B است.
  6. موارد 3 تا 5 را برای تمام پیکسل‌های تصویر انجام می‌دهیم.

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

from PIL import Image
def maxFilter(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):
            red = maxRed(source, i, j)
            green = maxGreen(source, i, j)
            blue = maxBlue(source, i, j)
            pixels[i, j] = (red, green, blue,255)
    
    
    result.save(destAddress, "PNG")
    
def maxRed(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]
    
    return max(neighbour)
def maxGreen(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]
    
    return max(neighbour)
def maxBlue(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]
    
    return max(neighbour)
    
if __name__ == '__main__':
    maxFilter('Max Filter input.png', 'Max Filter output.png')
    print('convert image finished...')

توابع استفاده شده در کد فوق:

  • تابع maxFilter: در این تابع فیلتر ماکزیمم پیاده سازی شده است.
  • متد maxRed: این تابع اندیس‌های یک پیکسل را در ورودی دریافت می‌کند و  ماکزیمم رنگ قرمز همسایگان 8 تایی به همراه پیکسل ورودی را بدست آورده در خروجی به ما می‌دهد. نکته قابل ذکر این است که چون پیکسل تصویر ما شامل سه عدد R و G و B بوده باید برای هر سه آنها به طور جداگانه مقدار ماکزیمم را محاسبه کرد.
  • متد MaxGreen: دقیقا مانند تابع MaxRed کار می‌کند فقط در خروجی ماکزیمم رنگ‌های سبز را به ما می‌دهد.
  • متد MaxBlue: مانند توابع MaxRed و MaxGreen بوده اما در خروجی ماکزیمم رنگ آبی پیکسل ورودی و همسایگانش را بر‌می‌گرداند.

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

فیلتر Max در پایتون

پسورد: www.codegate.ir

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

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

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