در این جلسه تیم کدگیت را با یکی دیگر از آموزشهای پردازش تصویر یعنی « الگوریتم فیلتر میانه در سی شارپ » همراهی کنید. قبل از شروع آموزش طبق روال آموزشهای گذشته پیشنیازهای این جلسه را معرفی میکنیم. پیشنیازها به صورت زیر است:
- خواندن تصاویر در سی شارپ
- ایجاد تصویر در سی شارپ
- حلقه 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 است.
- موارد فوق را برای تمام پیکسلهای تصویر انجام میدهیم.
کد الگوریتم فیلتر میانه در سی شارپ به صورت زیر است:
class MainClass
{
public static void Main (string[] args)
{
Bitmap myBitmap
= new Bitmap("Medianinput.jpg");
int width = myBitmap.Width;
int height = myBitmap.Height;
Color[] pixel = new Color[9];
int[] R = new int[9];
int[] B = new int[9];
int[] G = new int[9];
Bitmap output = new Bitmap(width, height);
for (int i = 1; i < width-1; i++)
{
for (int j = 1; j < height-1; j++)
{
pixel[0] = myBitmap.GetPixel(i - 1, j - 1);
pixel[1] = myBitmap.GetPixel(i - 1, j);
pixel[2] = myBitmap.GetPixel(i - 1, j + 1);
pixel[3] = myBitmap.GetPixel(i, j + 1);
pixel[4] = myBitmap.GetPixel(i + 1, j + 1);
pixel[5] = myBitmap.GetPixel(i + 1, j);
pixel[6] = myBitmap.GetPixel(i + 1, j - 1);
pixel[7] = myBitmap.GetPixel(i, j - 1);
pixel[8] = myBitmap.GetPixel(i, j);
for (int k = 0; k < 9; k++) {
R[k] = pixel[k].R;
B[k] = pixel[k].B;
G[k] = pixel[k].G;
}
Array.Sort (R);
Array.Sort (G);
Array.Sort (B);
output.SetPixel
(i, j, Color.FromArgb( R[4], G[4], B[4]));
}
}
output.Save("Medianoutput.jpg");
Console.WriteLine
("Press any key to Finish Create Green Image....");
Console.ReadKey ();
}
}
خروجی کد بالا به صورت زیر است:
همانطور که در تصویر فوق میبینید فیلتر میانه برای نویز گیری تصاویر استفاده میشود.
Download “دانلود سورس الگوریتم فیلتر میانه در سی شارپ”
Median-filter-in-csharp-www.codegate.ir_.zip – 124 بار دانلود شده است – 1,03 کیلوبایت
پسورد: www.codegate.ir