در این قسمت تیم کدگیت را با آموزش بهبود تصاویر در جاوا (پردازش تصاویر) همراهی کنید. در ادامه آموزش پردازش تصاویر، این جلسه به معرفی یک تبدیل میپردازیم. پیش نیاز این آموزش شامل موارد زیر است:
نمایش تصویر دیجیتال
یک تصویر دیجیتال را در پردازش تصویر به صورت تابع (F(x,y نمایش میدهند. با فرض اینکه تصویر ما M سطر و N ستون دارد مقادیر x و y دارای یک محدوده خاص میشوند. سطر و ستون ما از صفر شروع میشوند پس اولین خانه را (x,y)=(0,0) برای رفتن به یک ستون جلوتر باید به (۰,۱) برویم و برای رفتن به سطر بعد ……. تصویر زیر نمایش ماتریس یک عکس را نشان میدهد. توجه کنید که ماتریس از چپ بالا شروع شده است.
بنابراین ماتریس تصاویر به صورت زیر می شود(البته ماتریس زیر از 1 شروع شده است گاهی بجای یک از صفر در فرمولها استفاده میشود):
بهبود تصاویر در جاوا
تصاویر بهبود یافته در مقایسه با تصاویری که بهبود یافته نیستند، جزییات بیشتری را نشان میدهند و جالبتر اینکه در صنعت پزشکی و تصاویر جغرافیایی کاربردهای بسیاری نیز دارند. معمولا برای بهبود تصاویر از transformation یا تبدیلات استفاده میکنند. تبدیلات یک سری توابعی هستند که با تغییرات مختلف بر روی هر پیکسل از تصویر ما باعث تغییر و بهبود آنها میشوند.
تابع تبدیل به صورت زیر تعریف میشود:
s = T ( r )
r همان پیکسلهای تصویر اصلی ماست و T تابع تبدیل ما است که تغییراتی بر روی ورودی(r) خود میدهد و s هم تصویر بهبود یافته است که از تابع تبدیل T بدست آمده است. در این آموزش تبدیل Linear را پیاده سازی میکنیم.
تبدیل Linear
تبدیل linear خود شامل simple identity و negative transformation میشود. ما در این جا فقط به توضیح negative transformation میپردازیم. در تبدیل negative اصطلاحا هر پیکسل برعکس میشود. برای برعکس کردن یک پیکسل باید مقدار آن را از ۲۵۵ کم کرد!
در جاوا هر پیکسل شامل سه رنگ است(قرمز و سبز و آبی) از ترکیب این سه رنگ میتوان رنگهای دیگر را درست کرد. هر رنگ میتواند مقداری بین ۰ تا ۲۵۵ بگیرد. در زیر کد تبدیل negative آمده است.
public static void main(String[] args) {
try {
BufferedImage image = ImageIO.read(new File("Negative transformation albert einstein.jpg"));
for (int x = 0; x < image.getWidth(); x++) {
for (int y = 0; y < image.getHeight(); y++) {
int rgba = image.getRGB(x, y);
Color col = new Color(rgba, true);
col = new Color(255 - col.getRed(),
255 - col.getGreen(),
255 - col.getBlue());
image.setRGB(x, y, col.getRGB());
}
}
File outputFile = new File("negation - albert.jpg");
ImageIO.write(image, "png", outputFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
در کد بهبود تصاویر در جاوا متد getWidth تعداد ستون عکس و متد getHeight تعداد سطر عکس را برمیگرداند. متد getrgb مقدار پیکسل سطر و ستون ورودی را به صورت کلاس Color برمیگرداند. خروجی متدهای getred و getgreen و getblue مقادیر رنگهای مختلف در یک پیکسل است. متد setRGB هم مقدار پیکسل در سطر و ستون مورد نظر ما را عوض میکند . به عنوان نکته آخر در قسمت خواندن فایل، آدرس یک عکس سیاه و سفید بگذارید و سپس برنامه را اجرا کنید. در خروجی یک فایل به نام negation – albert.jpg در محل پروژه شما ذخیره میشود.