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

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

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

پیادهسازی فیلتر Min در پایتون
برای پیاده سازی فیلتر Min در پایتون مراحل زیر را انجام میدهیم:
- یک تصویر را به عنوان ورودی دریافت میکنیم.
- تصویر ورودی را میخوانیم. با توجه به تصویر نیاز به سه مینیمم داریم. (هر پیکسل شامل سه رنگ R و G و B است)
- برای پیکسل X و Y، پیکسلهای R و G و B همسایه 8 تایی و خود X و Y را درون لیست میریزیم.
- مقدار پیکسل جدید، مینیمم خانههای لیستهای R و G و B است. (به کمک تابع min)
- موارد 3 و 4 را برای تمام پیکسلهای تصویر انجام میدهیم.
کد این الگوریتم به صورت زیر است:
from PIL import Image
def minFilter(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 = minRed(source, i, j)
green = minGreen(source, i, j)
blue = minBlue(source, i, j)
pixels[i, j] = (red, green, blue,255)
result.save(destAddress, "PNG")
def minRed(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 min(neighbour)
def minGreen(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 min(neighbour)
def minBlue(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 min(neighbour)
if __name__ == '__main__':
minFilter('Min Filter input.png', 'Min Filter output.png')
print('convert image finished...')
توابع استفاده شده در کد فوق:
- تابع MinRed: این تابع اندیسهای یک پیکسل را در ورودی دریافت میکند و مینیمم رنگ قرمز همسایگان 8 تایی به همراه پیکسل ورودی را بدست آورده در خروجی به ما میدهد. نکته قابل ذکر این است که چون پیکسل تصویر ما شامل سه عدد R و G و B بوده باید برای هر سه آنها به طور جداگانه مقدار مینیمم را محاسبه کرد.
- تابع MinGreen: دقیقا مانند تابع MinRed کار میکند فقط در خروجی مینیمم رنگ سبز را به ما میدهد.
- تابع MinBlue: مانند تابعهای MinRed و MinGreen بوده اما در خروجی مینیمم رنگ آبی پیکسل ورودی و همسایگانش را برمیگرداند.
- تابع minFilter: این تابع ادرس فایل تصویر ورودی و ادرس خروجی را دریافت میکند و فیلتر مینیمم را برای تصویر ورودی اعمال میکند و در ادرس خروجی میریزد.
خروجی کد بالا به صورت زیر است:

در بالا ما یک تصویر داریم که واژه Min را در ورودی دریافت کرده است و در خروجی به دلیل استفاده از فیلتر مینیمم رنگ سیاه ضخیمتر شده، فیلتر مینیمم بین رنگ سیاه (مقدار صفر) و رنگ سفید (مقدار 255) مقدار کمتر یعنی رنگ سیاه را انتخاب میکند به همین دلیل تصویر خروجی به اصطلاح به حالت Bold تبدیل شده است.