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

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

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

پیادهسازی فیلتر Max در پایتون
برای پیاده سازی فیلتر Max در پایتون مراحل زیر را انجام میدهیم:
- یک تصویر را به عنوان ورودی دریافت میکنیم.
- تصویر ورودی را میخوانیم. با توجه به تصویر نیاز به سه ماکزیمم داریم. (هر پیکسل شامل سه رنگ R و G و B است)
- برای پیکسل X و Y، پیکسلهای R و G و B همسایه 8 تایی و خود X و Y را درون آرایه میریزیم.
- با صدا زدن تابع max پیکسل ماکزیمم آرایههای خود را پیدا میکنیم.
- مقدار پیکسل جدید، ماکزیمم آرایههای R و G و B است.
- موارد 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 بوده اما در خروجی ماکزیمم رنگ آبی پیکسل ورودی و همسایگانش را برمیگرداند.
خروجی کد بالا به صورت زیر است:
