در این جلسه تیم کدگیت به آموزش فیلتر نقطه میانی در جاوا میپردازد. طبق روال آموزشهای گذشته ابتدا فیلتر نقطه میانی را معرفی سپس به پیاده سازی آن در زبان جاوا خواهیم پرداخت. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای ذیل را بخوانید:
- خواندن و نوشتن تصاویر در جاوا
- بهبود تصاویر در جاوا
- حلقه For در جاوا
- فیلتر میانگین در جاوا
- فیلتر مینیمم در جاوا
- فیلتر ماکزیمم در جاوا
فیلتر نقطه میانی
در فیلتر نقطه میانی رنگ هر پیکسل با مقدار میانگین پیکسلهای مینیمم و ماکزیمم همسایگی خود تعیین میشود. به عنوان مثال تصویر زیر را ببینید. پیکسلهای همسایه عدد 10 در آن برابر با 2 و 4 و 6 و 8 و 12 و 14 و 16 ئ 18 است. برای محاسبه نقطه میانی کافی است میانگین دو عدد ماکزیمم و مینیمم یعنی 2/(18+2) را محاسبه کنیم.

فیلتر نقطه میانی در جاوا
برای پیادهسازی فیلتر نقطه میانی کافی است همسایگی پیکسل X و Y را خوانده و نقطه میانی آن را با توجه به فرمول بالا محاسبه و جایگزین پیکسل X و Y کنید. کد فیلتر میانی در جاوا به صورت زیر میباشد:
public class Midpoint_Filter {
public static void main(String[] args) {
BufferedImage img = null;
File f = null;
// read image
try {
f = new File("Midpoint Filter input.jpg");
img = ImageIO.read(f);
} catch (IOException e) {
System.out.println(e);
}
// get width and height
int width = img.getWidth();
int height = img.getHeight();
BufferedImage outputimage = new
BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
System.out.println("Mdipoint Filter starts....");
for (int x = 1; x < width - 1; x++) {
for (int y = 1; y < height - 1; y++) {
int mid = MidPoint(img, x, y);
Color col = new Color(mid, mid, mid);
outputimage.setRGB(x, y, col.getRGB());
}
}
System.out.println("start create output image....");
// write image
try {
f = new File("Midpoint Filter output.jpg");
ImageIO.write(outputimage, "jpg", f);
} catch (IOException e) {
System.out.println(e);
}
System.out.println("program finish....");
}
public static int MidPoint(BufferedImage img, int x, int y) {
int neighbour[] = new int[9];
neighbour[0] = (getRed(img.getRGB(x - 1, y - 1))
+ getGreen(img.getRGB(x - 1, y - 1))
+ getBlue(img.getRGB(x - 1, y - 1))) /3;
neighbour[1] = (getRed(img.getRGB(x + 1, y + 1))
+ getGreen(img.getRGB(x + 1, y + 1))
+ getBlue(img.getRGB(x + 1, y + 1))) /3;
neighbour[2] = (getRed(img.getRGB(x, y - 1)) +
getGreen(img.getRGB(x, y - 1)) +
getBlue(img.getRGB(x, y - 1)))/3;
neighbour[3] = (getRed(img.getRGB(x, y + 1)) +
getGreen(img.getRGB(x, y + 1)) +
getBlue(img.getRGB(x, y + 1)))/3;
neighbour[4] = (getRed(img.getRGB(x - 1, y)) +
getGreen(img.getRGB(x - 1, y)) +
getBlue(img.getRGB(x - 1, y)))/3;
neighbour[5] = (getRed(img.getRGB(x + 1, y)) +
getGreen(img.getRGB(x + 1, y)) +
getBlue(img.getRGB(x + 1, y)))/3;
neighbour[6] = (getRed(img.getRGB(x - 1, y + 1)) +
getGreen(img.getRGB(x - 1, y + 1)) +
getBlue(img.getRGB(x - 1, y + 1)))/3;
neighbour[7] = (getRed(img.getRGB(x + 1, y - 1)) +
getGreen(img.getRGB(x + 1, y - 1)) +
getBlue(img.getRGB(x + 1, y - 1)))/3;
neighbour[8] = (getRed(img.getRGB(x, y)) +
getGreen(img.getRGB(x, y)) +
getBlue(img.getRGB(x, y)))/3;
Arrays.sort(neighbour);
return (neighbour[8] + neighbour[0]) / 2;
}
public static int getRed(int rgb) {
return (rgb >> 16) & 0xff;
}
public static int getBlue(int rgb) {
return rgb & 0xff;
}
public static int getGreen(int rgb) {
return (rgb >> 8) & 0xff;
}
}
متدهای مورد استفاده کد فوق:
- متد getRed: از آنجا که ما با تصاویر RGB کار میکنیم در هنگام دریافت یک پیکسل در جاوا رنگهای R و G و B را به صورت یکجا در یک مقدار به ما میدهد. این متد مقدار رنگ قرمز را از رنگ سبز و آبی جدا کرده و به ما برمیگرداند.
- متد getGreen: مانند متد getred بوده اما رنگ سبز یک پیکسل را برای ما برمیگرداند.
- متد getBlue: مانند متدهای بالا بوده اما رنگ قرمز یک پیکسل را به ما میدهد.
- Midpoint: متد midpoint پیکسلهای همسایه را تبدیل به GrayScale میکنیم(برای سادگی کار). در ادامه پیکسلهای همسایه ها را مرتب میکنیم. و میانگین ماکزیمم و مینیمم را محاسبه کرده و در خروجی متد قرار میدهیم.
خروجی فیلتر نقطه میانی
خروجی کد فوق به صورت زیر میباشد:

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