در این قسمت تیم کدگیت را با آموزش تبدیل Affine در جاوا (پردازش تصویر) همراهی کنید. در ابتدای این جلسه تبدیل Affine را معرفی می‌کنیم و در خصوص نحوه کار آن صحبت خواهیم کرد. در پایان این تبدیل را در جاوا پیاده‌سازی خواهیم کرد. پیشنهاد می‌کنیم قبل از بررسی این جلسه، آموزش‌های زیر را مطالعه کنید:

  1. خواندن و نوشتن تصاویر در جاوا
  2. بهبود تصاویر در جاوا
  3. حلقه For در جاوا
  4. تبدیل توانی در جاوا
  5. تبدیل لگاریتمی در جاوا

تبدیل Affine

تبدیل آفین یا تبدیل 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 در جاوا

برای پیاده‌سازی تبدیل Affine در جاوا باید تمامی پیکسل‌های تصویر را خوانده و فرمول فوق را برای تمامی پیکسل‌های تصویر اعمال می‌کنیم. کد این تبدیل به صورت زیر می‌باشد:

	public static void main(String[] args) {
		BufferedImage img = null;
		File file = null;
		// read image
		try {
			file = new File("Affine input.png");
			img = ImageIO.read(file);
		} catch (IOException e) {
			System.out.println(e);
		}
		int width = img.getWidth();
		int height = img.getHeight();
		BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		/*
		 * [ a b c ] 		[x]    [ ax+by+c ]
		 * [ d e f ]   *    [y] =  [ dx+ey+f ]
		 * [ 0 0 1 ]   		[1]	   [    1    ]
		 * 
		 */
		int a = 00;
		int b = 1;
		int c = 00;
		int d = 1;
		int e = 00;
		int f = 00;
		for (int x = 00; x < width; x++) {
			for (int y = 00; y < height; y++) {
				int newX = a * x + b * y + c;
				int newY = d * x + e * y + f;
				output.setRGB(newX, newY, img.getRGB(x, y));
			}
		}
		try {
			file = new File("Affine Output.jpg");
			ImageIO.write(output, "jpg", file);
		} catch (IOException e1) {
			System.out.println(e1);
		}
	}

newX و newY مکان جدید پیکسل x و y است. خروجی کد فوق به صورت زیر می‌باشد:

تبدیل Affine در جاوا

Download “دانلود سورس تبدیل Affine در جاوا”

Affine-Transformation-in-java-www.codegate.ir_.zip – 187 بار دانلود شده است – 106,84 کیلوبایت

پسورد فایل: www.codegate.ir