در این جلسه تیم کدگیت به آموزش فیلتر نقطه میانی در پایتون میپردازد. طبق روال آموزشهای گذشته ابتدا فیلتر نقطه میانی را معرفی سپس به پیاده سازی آن در زبان پایتون خواهیم پرداخت. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای ذیل را بخوانید:
- خواندن تصاویر در پایتون
- حلقه For در پایتون
- توابع در پایتون
- لیست در پایتون
- فیلتر مینیمم در پایتون
- فیلتر ماکزیمم در پایتون
فیلتر نقطه میانی
در فیلتر نقطه میانی رنگ هر پیکسل با مقدار میانگین مینیمم و ماکزیمم پیکسلهای همسایگی خود تعیین میشود. به عنوان مثال تصویر زیر را ببینید. پیکسلهای همسایه عدد 10 در آن برابر با 2 و 4 و 6 و 8 و 12 و 14 و 16 و 18 است. برای محاسبه نقطه میانی کافی است میانگین دو عدد ماکزیمم و مینیمم یعنی 2/(18+2) را محاسبه کنیم.
فیلتر نقطه میانی در پایتون
برای پیادهسازی فیلتر نقطه میانی در پایتون کافی است همسایگی پیکسل X و Y را خوانده و نقطه میانی آن را با توجه به فرمول بالا محاسبه و جایگزین پیکسل X و Y کنید. کد فیلتر میانی در پایتون به صورت زیر میباشد:
from PIL import Image
import math
def midpointFilter(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):
redMid = findRedMidpoint(source, i, j)
greenMid = findGreenMidpoint(source, i, j)
blueMid = findBlueMidpoint(source, i, j)
pixels[i, j] = (redMid, greenMid, blueMid, 255)
result.save(destAddress, "jpeg")
def findRedMidpoint(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]
maxRed = max(neighbour)
minRed = min(neighbour)
return math.floor((maxRed + minRed) / 2)
def findGreenMidpoint(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]
maxGreen = max(neighbour)
minGreen = min(neighbour)
return math.floor((maxGreen + minGreen) / 2)
def findBlueMidpoint(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]
maxBlue = max(neighbour)
minBlue = min(neighbour)
return math.floor((maxBlue + minBlue) / 2)
if __name__ == '__main__':
midpointFilter('Midpoint Filter input.jpg', 'Midpoint Filter output.jpg')
print('convert image finished...')
متدهای مورد استفاده کد فوق:
- تابع findRedMidpoint: این تابع میانگین ماکزیمم و مینیمم قرمز رنگ همسایگان پیکسل X و Y (پیکسل ورودی تابع) را در خروجی به ما میدهد.
- تابع findGreenMidpoint: این تابع میانگین ماکزیمم و مینیمم سبز رنگ همسایگان پیکسل X و Y (پیکسل ورودی تابع) را در خروجی به ما میدهد.
- تابع findBlueMidpoint: این تابع میانگین ماکزیمم و مینیمم آبی رنگ همسایگان پیکسل X و Y (پیکسل ورودی تابع) را در خروجی به ما میدهد.
- تابع midpointFilter: در این تابع ادرس تصویر در ورودی دریافت و با اعمال فیلتر نقطه میانی بر روی تمامی پیکسلها، تصویر را در آدرس خروجی ذخیره میکند. فایل خروجی پس از اجرای برنامه ایجاد میشود.
خروجی فیلتر نقطه میانی
خروجی کد فوق به صورت زیر میباشد:
همانطور که در تصویر خروجی می بینید فیلتر نقطه میانی برای تصاویری استفاده میشود که دنباله کوتاه (کم برد) استفاده میشود.