در این جلسه تیم کدگیت را با آموزش تبدیل تصویر رنگی به خاکستری در جاوا همراهی کنید. در ابتدای این جلسه در خصوص تصاویر خاکستری و رنگی توضیح کوتاهی میدهیم سپس به پیادهسازی تبدیل مذکور میپردازیم. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را بررسی کنید:
تصاویر خاکستری
تصویر خاکستری (Grayscale) به تصویری گفته میشود که در آن تنها از طیف رنگی خاکستری استفاده شده است و شدت نور هر پیکسل آن میتواند از مشکی تا سفید تغییر کند. در رایانه بسته به تعداد بیتی که برای هر نمونه پیکسل اختصاص داده میشود تعداد رنگ قابل نمایش طیف خاکستری متغیر خواهد بود. برای مثال اگر 8 بیت برای ذخیره شدت نور هر پیکسل در نظر گرفته شود 256 رنگ مختلف در Grayscale قابل نمایش خواهد بود. البته در کاربردهایی نظیر عکسبرداری پزشکی، برای افزایش دقت تصویر تعداد بیت بیشتری مورد نیاز میباشد.
تصاویر RGB
برای ایجاد تصویر در مانیتورها ( مانند تلویزیون و مانیتور کامپیوتر و ..) از مدل رنگی RGB استفاده میشود. این مدل شامل ترکیبی از سه رنگ قرمز، سبز، آبی میباشد هر یک از رنگها شامل مقداری بین 0 تا 255 هستند. بنابراین به عنوان مثال ، اگر بخواهیم یک رنگ کاملاً آبی ایجاد کنید ، مقدار قرمز برابر با 0 ، مقدار سبز برابر با 0 و آبی برابر با 255 خواهد داشت. برای ایجاد رنگ سیاه ، قرمز ، سبز و آبی هر یک دارای مقدار 0 و برای ایجاد رنگ سفید ، مقدار تمامی رنگها 255 خواهد بود.
تبدیل تصویر رنگی به خاکستری در جاوا
برای تبدیل تصاویر رنگی به خاکستری ما از روش میانگین استفاده میکنیم. ابتدا مقادیر RGB تصویر رنگی را دریافت و مقدار پیکسل جدید، میانگین مقادیر RGB قرار میدهیم. برای پیاده سازی ابتدا یک تصویر را میخوانیم:
BufferedImage image =
ImageIO.read(new File("baboon.png"));
حالا نوبت به خواندن پیکسلهای تصویر رسیده است. با دو حلقه for این کار را انجام میدهیم:
for (int i = 0; i < image.getHeight(); i++) {
for (int j = 0; j < image.getWidth(); j++) {
int color = image.getRGB(i, j);
Color rgb = new Color(color);
متغیر rgb پیکسل رنگی خوانده شده است. با دریافت مقادیر R و G و B به صورت جداگانه و محاسبه میانگین آنها، مقدار پیکسل جدید را بدست میآوریم:
int avg = (rgb.getBlue()+
rgb.getGreen()+rgb.getRed())/3;
Color newpixel = new Color(avg, avg, avg);
متغیر avg مقدار میانگین رنگهای قرمز، آبی و سبز پیکسل تصویر است. حال نوبت به قرار دادن این مقدار به عنوان پیکسل تصویر خروجی میباشد:
image.setRGB(i, j, newpixel.getRGB());
تست برنامه
برای تست کدهای بالا، کد زیر را اجرا نمایید(دقت کنید فایل تصویر Baboon.png در فولدر پروژه خود قرار دهید):
public class ComvertToGray {
public static void main(String[] args) {
try {
BufferedImage image = ImageIO.read
(new File("baboon.png"));
for (int i = 0; i < image.getHeight(); i++) {
for (int j = 0; j < image.getWidth(); j++) {
int color = image.getRGB(i, j);
Color rgb = new Color(color);
int avg = (rgb.getBlue()
+rgb.getGreen()+rgb.getRed())/3;
Color newpixel = new Color(avg, avg, avg);
image.setRGB(i, j, newpixel.getRGB());
}
}
ImageIO.write(image, "jpg", new File("gray.jpg"));
System.out.println("Finish!!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
خروجی کد بالا به صورت زیر میباشد:

مچکر
خواهش می کنم