در این قسمت تیم کدگیت را با آموزش تبدیل Affine در پایتون (پردازش تصویر) همراهی کنید. در ابتدای این جلسه تبدیل Affine را معرفی میکنیم و در خصوص نحوه کار آن صحبت خواهیم کرد. در پایان این تبدیل را در پایتون پیادهسازی خواهیم کرد. پیشنهاد میکنیم قبل از بررسی این جلسه، آموزشهای زیر را مطالعه کنید:
- خواندن تصاویر در پایتون
- حلقه For در پایتون
- تبدیل توانی در پایتون
- تبدیل لگاریتمی در پایتون
- لیست در پایتون
تبدیل Affine
تبدیل آفین یا تبدیل Affine نوعی تبدیل ریاضی است که همخطیبودن و نسبت فاصلهها در آن حفظ میشود. بدین ترتیب در نتیجه یک تبدیل Affine، تمامی نقاط روی یک خط در ورودی، در خروجی نیز روی یک خط خواهند ماند. با این وجود در تبدیلهای Affine طول و زاویه بین خطها لزوماً حفظ نمیشود.
تعریف فوق توضیح ریاضی تبدیل Affine میباشد. برای اینکه ما بتوانیم این تبدیل را پیاده سازی کنیم باید با فرمول آن آشنا باشیم. فرمول این تبدیل به صورت زیر میباشد:
در فرمول بالا ما یک ورودی x و y داریم که در اعداد ثابت آن یعنی a و b و c و d و e و f به شکل فوق ضرب میکنیم. در صورتی که ما X و Y را ورودی و NewX و NewY را نقطه تبدیل یافته معرفی کنیم، تبدیل Affine به صورت زیر میباشد:
NewX = aX+bY+c
NewY = dX+eY+f
حال فرض کنید ما میخواهیم نقاط یک تصویر را با فرمول بالا جابجا کنیم. کافی است پیکسل های یک نقطه(مثلا X و Y) را به نقطه جدید(مثلا newX و newY) منتقل کنیم. به عنوان مثال اگر مقادیر ماتریس ما به صورت زیر باشد در خروجی تصویر به چه شکل تغییر میکند؟(جواب با شما)
پیاده سازی تبدیل Affine در پایتون
برای پیادهسازی تبدیل Affine در پایتون باید تمامی پیکسلهای تصویر را خوانده و فرمول فوق را برای تمامی پیکسلهای تصویر اعمال میکنیم. کد این تبدیل به صورت زیر میباشد:
from PIL import Image
def AffineTransformation (sourceAddress, destAddress):
source = Image.open (sourceAddress)
result = Image.new ('RGB', source.size)
width, height = source.size
pixels = result.load()
a = 00;
b = 1;
c = 00;
d = 1;
e = 00;
f = 00;
for x in range(00, width, 1):
for y in range(00, height, 1):
newX = a * x + b * y + c;
newY = d * x + e * y + f;
red = source.getpixel((x, y))[00]
green = source.getpixel((x, y))[1]
blue = source.getpixel((x, y))[2]
pixels[newX, newY] = (red, green, blue, 255)
result.save(destAddress, "PNG")
if __name__ == '__main__':
AffineTransformation('affine input.png', 'affine output.png')
print('convert image finished...')
در کد فوق ما ابتدا یک تصویر را خوانده سپس تمامی پیکسلهای آن را با فرمول تبدیل Affine جابجا کردیم. متغیر newX و newY مکان جدید پیکسل x و y است. خروجی کد فوق به صورت زیر میباشد:
در صورت اینکه بخشی از کد را متوجه نشدید در کامنت سوال خود را قرار دهید تا شما را راهنمایی کنیم.
سلام ممنون بابت مقاله عالی تون
زمان اجرای کد داخل خط ششم ارور زیر را میدهد.
line 6, in
from PIL import Image
ModuleNotFoundError: No module named ‘PIL’
لطفا راهنمایی کنید مشکل ازئ کجاست.
سلام. باید کتابخانه pil رو نصب کنید.
Pip install pillow
دستور بالا رو بزنید تا کتابخانه نصب بشه.