در این جلسه تیم کدگیت را با یکی دیگر از آموزشهای پردازش تصویر یعنی « الگوریتم فیلتر میانه در جاوا » همراهی کنید. قبل از شروع آموزش طبق روال آموزشهای گذشته پیشنیازهای این جلسه را معرفی میکنیم. پیشنیازها به صورت زیر است:
- خواندن و نوشتن تصاویر در جاوا
- بهبود تصاویر در جاوا
- حلقه For در جاوا
- استثناها در جاوا
- فایل در جاوا
- آرایه در جاوا
میانه چیست؟
میانه عدد وسط مجموعهای از اعداد مرتب است و به دو صورت زیر محاسبه میشود:
- تعداد اعداد مجموعه زوج باشد: میانگین دو عدد وسط را میانه میگویند.
- تعداد اعداد مجموعه فرد باشد: عدد وسط مجموعه را میانه تعریف میکنند.
به عنوان مثال مجموعه مرتب زیر را ببینید:
9, 12, 14, 17, 19, 22, 25
تعداد اعداد 7 است(فرد است) پس میانه عدد وسط یعنی عدد 17 میشود. به عنوان مثال دوم میانه مجموعه زیر را پیدا کنید:
8, 12, 14, 17, 21, 23, 25, 30
تعداد اعداد 8(زوج است) است پس میانه برابراست با میانگین دو عدد وسط یعنی 2/(17+21).
همسایه یک پیکسل در تصاویر
همانطور که در آموزش بهبود تصاویر در جاوا گفته شد تصاویر از پیکسلها تشکیل شده و نحوه نمایش آنها به صورت آرایه دو بعدی است(البته تصاویر RGB سه آرایه دو بعدی داریم!). به تصویر زیر دقت کنید:

در تصویر بالا همسایگان پیکسل X و Y را نمایش دادیم. این نمایش را نمایش همسایگان 8 تایی یک پیکسل تعریف میکنند. همسایه 4 تایی یک پیکسل به صورت زیر نمایش داده میشود:

محاسبه الگوریتم فیلتر میانه در جاوا
فیلتر میانه یک همسایگی اطراف پیکسل را در نظر میگیرد و میانه اعداد موجود در آن همسایگی را به عنوان مقدار پیکسل جدید در نظر میگیرد. به تصویر زیر دقت کنید:

میخواهیم فیلتر میانه بر روی پیکسل وسط (عدد 15 تصویر بالا) محاسبه کنیم ابتدا تمامی همسایهها و خود پیکسل را به صورت مرتب در آورده و سپس میانه آنها را محاسبه میکنیم. در تصویر بالا عدد 9 عدد وسط است(خانه چهارم) پس میانه ما نیز 9 میشود(تعداد اعداد مجموعه ما فرد است) پس مقدار 9 جایگزین 15 میشود(به همین سادگی!). همین کار را برای تمامی پیکسلها انجام میدهیم.
برای سادگی کار ما مرز یک تصویر را در نظر نمیگیریم اما راهحلهای مختلفی وجود دارد که این مشکل را برطرف کرده است.

کد الگوریتم فیلتر میانه در جاوا
پیادهسازی الگوریتم فیلتر میانه در جاوا بسیار ساده است. ابتدا یک تصویر رنگی را میخوانیم. سپس برای تمامی پیکسلهای آن موارد زیر را اعمال میکنیم:
- سه آرایه به طول 9 ایجاد میکنیم(آرایهها برای ذخیره R و G و B است).
- برای پیکسل X و Y، پیکسلهای همسایه 8 تایی و خود X و Y را درون آرایه خود(آرایههای مورد 1) میریزیم.
- آرایههای خود را مرتب میکنیم.
- مقدار پیکسل جدید، مقدار خانه چهارم آرایههای R و G و B است.
- موارد فوق را برای تمام پیکسلهای تصویر انجام میدهیم.
کد الگوریتم فیلتر میانه در جاوا به صورت زیر است:
public class Median_Filter {
public static void main(String[] args) {
File f = new File
("Medianinput.jpg"); // Input Photo File
Color[] pixel = new Color[9];
int[] R = new int[9];
int[] B = new int[9];
int[] G = new int[9];
File output = new File("Medianoutput.jpg");
BufferedImage img = null;
try {
img = ImageIO.read(f);
} catch (IOException e1) {
e1.printStackTrace();
}
for (int i = 1; i < img.getWidth() - 1; i++)
for (int j = 1; j < img.getHeight() - 1; j++) {
pixel[0] = new Color(img.getRGB(i - 1, j - 1));
pixel[1] = new Color(img.getRGB(i - 1, j));
pixel[2] = new Color(img.getRGB(i - 1, j + 1));
pixel[3] = new Color(img.getRGB(i, j + 1));
pixel[4] = new Color(img.getRGB(i + 1, j + 1));
pixel[5] = new Color(img.getRGB(i + 1, j));
pixel[6] = new Color(img.getRGB(i + 1, j - 1));
pixel[7] = new Color(img.getRGB(i, j - 1));
pixel[8] = new Color(img.getRGB(i, j));
for (int k = 0; k < 9; k++) {
R[k] = pixel[k].getRed();
B[k] = pixel[k].getBlue();
G[k] = pixel[k].getGreen();
}
Arrays.sort(R);
Arrays.sort(G);
Arrays.sort(B);
img.setRGB
(i, j, new Color(R[4], B[4], G[4]).getRGB());
}
try {
ImageIO.write(img, "jpg", output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
خروجی کد بالا به صورت زیر است:

همانطور که در تصویر فوق میبینید فیلتر میانه برای نویز گیری تصاویر استفاده میشود.