در این قسمت تیم کدگیت را با آموزش تبدیل سپیا رنگ در جاوا (پردازش تصویر) همراهی کنید. آموزشهای گذشته پردازش تصویر در مورد بهبود تصاویر صحبت شد در ادامه همین مبحث در این جلسه آموزش تبدیل سپیا (sepia) رنگ را توضیح داده و در زبان برنامهنویسی جاوا آن را پیادهسازی خواهیم کرد. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را مطالعه کنید:
تبدیل سپیا رنگ در جاوا
رنگ سپیا (Sepia) به قهوه ای متمایل به قرمز گفته می شود. این رنگ در عکاسی کاربردهای فراوانی دارد. برای تبدیل تصاویر به این رنگ باید فرمول زیر را به کار ببریم:
newRed = 0.393*R + 0.769*G + 0.189*B
newGreen = 0.349*R + 0.686*G + 0.168*B
newBlue = 0.272*R + 0.534*G + 0.131*B
متغیر R و G و B به ترتیب رنگ قرمز و سبز و آبی درون پیکسل تصویر است با استفاده از فرمول فوق، الگوریتم تبدیل یک عکس به رنگ سپیا به صورت زیر میباشد:
- تمامی پیکسل تصویر رنگی را دریافت کرده
- با استفاده از پیکسلهای ورودی newRed و newGreen و newBlue را محاسبه میکنیم.
- شرط زیر را برای مقادیر محابسبه شده در فرمول بالا به کار میبریم (متغیر R و G و B به ترتیب رنگ قرمز و سبز و آبی درون پیکسل تصویر است):
- If newRed > 255 then R = 255 else R = newRed
- If newGreen > 255 then G = 255 else G = newGreen
- If newBlue > 255 then B = 255 else B = newBlue
- مقادیر RGB جدید را جایگزین مقادیر قبلی میکنیم.
- مراحل 1 تا 4 را برای تمامی پیکسلها تکرار میکنیم.
پیادهسازی تبدیل سپیا رنگ در جاوا
برای پیادهسازی تبدیل سپیا ابتدا باید یک تصویر را خوانده و پیکسهای آن را با فرمول داده شده تغییر دهیم. کد این تبدیل به صورت زیر میباشد:
public class Sepia {
public static void main(String args[]) throws IOException {
BufferedImage img = null;
File f = null;
System.out.println("Reading Image...");
// read image
try {
f = new File("baboon.png");
img = ImageIO.read(f);
} catch (IOException e) {
System.out.println(e);
}
// get width and height of the image
int width = img.getWidth();
int height = img.getHeight();
System.out.println("converting to sepia Image...");
// convert to sepia
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int p = img.getRGB(x, y);
Color col = new Color(p, true);
int a = col.getAlpha();
int R = col.getRed();
int G = col.getGreen();
int B = col.getBlue();
// calculate newRed, newGreen, newBlue
int newRed = (int) (0.393 * R + 0.769 * G + 0.189 * B);
int newGreen = (int) (0.349 * R + 0.686 * G + 0.168 * B);
int newBlue = (int) (0.272 * R + 0.534 * G + 0.131 * B);
// check condition
if (newRed > 255)
R = 255;
else
R = newRed;
if (newGreen > 255)
G = 255;
else
G = newGreen;
if (newBlue > 255)
B = 255;
else
B = newBlue;
// set new RGB value
col = new Color(R, G, B);
img.setRGB(x, y, col.getRGB());
}
}
// write image
System.out.println("Creating new image...");
try {
f = new File("sepiababoon.jpg");
ImageIO.write(img, "jpg", f);
} catch (IOException e) {
System.out.println(e);
}
System.out.println("Finishing...");
}
}
همانطور که در کد بالا میبینید پس از خواندن تصویر ، پیکسلهای آن را با توجه به فرمول تغییر دادهایم. در آخر مقادیر بیشتر از 255 در RGB را عدد 255 قرار دادیم. خروجی برنامه به صورت زیر میباشد: