скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыКурсовая работа: Програма обробки зображень

Виділення контурів

Лінійні фільтри можуть бути призначені не для придушення шуму, а для підкреслення перепадів яскравості і контурів. Виділення вертикальних перепадів здійснюється диференціюванням по рядках, горизонтальних  по стовпцях. Диференціювання виробляється в цифровій формі:

Тут ∆x=1 ? збільшення уздовж рядка, рівне 1 пікселу,

?y=1 ? збільшення уздовж стовпця, також рівне 1 пікселу.

Виділення перепадів по діагоналі можна одержати, обчислюючи різниц рівнів діагональних пар елементів.

Для виділення перепадів використовуються наступні набори вагових множників, що реалізують двовимірне диференціювання:

Північ північний схід схід південний схід

південь південний захід захід        північний захід

Назва географічних напрямків говорить про напрямок схилу перепаду, що викликає максимальний відгук фільтра. Сума вагових множників масок дорівню нулеві, тому на ділянках зображення з постійною яскравістю ці фільтри дають нульовий відгук.

Виділення горизонтального перепаду можна виконати також шляхом обчислення збільшення різниці яскравості пікселів уздовж рядка, що рівноцінно обчисленню другої похідної по напрямку (оператор Лапласа):

Це відповідає одномірній масці Н = | 1 2 1|, сума вагових множників дорівнює нулеві. У такий же спосіб можна шукати перепади по вертикалі і по діагоналі. Для виділення перепадів без обліку їхньої орієнтац використовуються двовимірні оператори Лапласа:


Тут сума вагових множників також дорівнює нулеві. На мал. 7 приведене вихідне зображення і результат застосування оператора Лапласа Н13.

Оператори Лапласа реагують на перепади яскравості у виді східчастого перепаду і на "дахоподібний" перепад. Вони також виділяє ізольован крапки, тонкі лінії, їхні кінці і гострі кути об'єктів. Лінія підкреслюється в 2 рази яскравіше, ніж східчастий перепад, кінець лінії в 3 рази, а крапка  у 4 рази яскравіше. Оператор Лапласа не інваріантний до орієнтації перепадів: наприклад, відгук оператора на похилий перепад у діагональному напрямку майже вдвічі більше, ніж у горизонтальному і вертикальному.

З фізичної точки зору, фільтри H5  H15 фільтрами верхніх частот, вони виділяють високочастотні складові корисного зображення, відповідальні за перепади яскравості і контури і придушують "постійну складову". Однак при їхньому використанні рівень шуму на зображенні зростає.

Фільтри для виділення перепадів і границь, як і фільтри H1  H4 для придушення шуму, можуть бути рекурсивними.

Зображення з підкресленими границями (контурами) суб'єктивно сприймається краще, ніж оригінал. Відбувається фокусування частково розфукусованого зображення. При використанні оператора Лапласа для цих цілей застосовують три типових набори вагарень множників:


H16  H18 відрізняються від фільтрів H13  H15 тим, що до центрального елемента матриці додана 1, тобто при фільтрації вихідне зображення накладається на контур.

Для виділення контурів і перепадів яскравості можуть застосовуватися нелінійні фільтри. У нелінійних алгоритмах використовують нелінійні оператори дискретного диференціювання. У фільтрі Робертса використовується маска, що переміщається 2:

диференціювання виробляється за допомогою одного з виражень

Подпись:  

               исходное изображение                                    фильтр Собела

Рис. 8. Применение фильтра Собела 

У фільтрі Собела використовується вікно 33:

Центральному (i,j) -му пікселу замість f i,j привласнюється значення яскравості або  , де

На мал. 8 показані результати застосування фільтра Собела.

2.4.   Опис та обґрунтування вибору складу технічних та програмних засобів

Згідно з поставленою задачею оберемо технічні та програмн засоби реалізації програми. Програма написана на мові програмування високого рівня (С#). Дана програма розрахована на операційні системи Windows 2000, NT, XP з встановленою середою .NET 2.0 чи 3.0.


3.      Опис інтерфейсу програми

Програма має зручний та доступний інтерфейс для роботи з користувачем. На рис. 1 показано вигляд вікна спілкування з користувачем до початку роботи з програмою.

Рис.1. Зображення діалогового вікна програми.

За допомогою меню „Файл” користувач має можливість відкрити файл з зображенням. У першій частині робочого вікна ми маємо змогу бачити не фільтроване зображення. Також меню „Файл” надає можливість зберегти файл під вибраним чи іншим ім’ям.

Меню „Фильтровать” надає змогу відфільтрувати зображення. Він має наступні підменю

1. Лапласіан

2. Гаусовий

3. Smoothing

4. Довільне ядро

Після обрання будь-якого пункту меню на екран виводиться вікно з ядром

Рис 2. Вікно з ядром

При натисненні на кнопку „ОК” ми бачимо вікно, що виводиться під час обрахунків.

Рис.3 Вікно, що повідомляє про проходження обрахунків

Після виконання обрахунків ми бачимо на головному вікні у другій його частині фільтроване зображення, відповідно до обраної фільтрації.

Також, користувач має можливість власноруч заповнити матрицю з коефіцієнтами.

Далі наведені результати роботи програми з різними фільтрами:


4. Перевірка функціонування програми

Програма повністю відповідає наведеному вище алгоритму.


ВИСНОВКИ

Розробивши програмну модель обробки файлів зображень, я дійшов висновку, що найбільша складність у подібних задачах є розробка досить універсального алгоритму та оформлення результатів (введення та вивід).


ДЖЕРЕЛА, ЩО ВИКОРИСТАНІ ПРИ РОЗРОБЦІ

1.               В.Б. Жушма, Ф. Колокольцев, Р.Коринь, Ю. Мевшин, Т. Мовчан, Л.Д. Писаренко, Ю. Путилов. Роздільне унітарне перетворення зображень, УЖ МТиТ 1999 № 2-3.

2.               В,Б, Жушма, Ф. Колокольцев, Р,Корннь, Ю, Мевшнн, Т.В, Мовчан, Л.Д. Писаренко, Ю. Путилов. Сингулярне перетворення зображень, УЖ МТиТ 1999 №4.

3.               http://msdn2.microsoft.com/ru-ru/default.aspx


ДОДАТОК1

ЛІСТИНГ ПРОГРАМИ

MainForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace Kursach

{

 public partial class MainForm : Form

 {

 private string filename = "";

 WaitForm win = null;

 public MainForm()

 {

 InitializeComponent();

 }

 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)

 {

 this.Close();

 }

 private void OpenToolStripMenuItem_Click(object sender, EventArgs e)

 {

 if (openFileDialog.ShowDialog() == DialogResult.OK)

 picture.Image = new Bitmap(filename = openFileDialog.FileName);

 }

 private void SaveAsToolStripMenuItem_Click(object sender, EventArgs e)

 {

 if (saveFileDialog.ShowDialog() == DialogResult.OK)

 {

 picture.Image.Save(filename = saveFileDialog.FileName);

 }

 }

 private void SaveToolStripMenuItem_Click(object sender, EventArgs e)

 {

 picture.Image.Save(filename);

 }

 private void лапласианToolStripMenuItem_Click(object sender, EventArgs e)

 {

 Start<Laplacian>(false);

 }

 public void Start<T>(bool edit) where T : IKernel, new()

 {

 IKernel kernel = new T();

 Bitmap bitmap = new Bitmap(picture.Image);

 if (new KernelForm(false, kernel).ShowDialog() == DialogResult.OK)

 {

 win = new WaitForm(backgroundWorker);

 win.Show(this);

 backgroundWorker.RunWorkerAsync(new StartParam(bitmap, kernel));

 }

 }

 private void smoothingToolStripMenuItem_Click(object sender, EventArgs e)

 {

 Start<Smoothing>(false);

 }

 private void гаусовыйToolStripMenuItem_Click(object sender, EventArgs e)

 {

 Start<Gaussian>(false);

 }

 private void CustomToolStripMenuItem_Click(object sender, EventArgs e)

 {

 Start<Unknown>(true);

 }

 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)

 {

 StartParam s = (StartParam)e.Argument;

 pictureF.Image = Filter.Filtering(s.b, s.k.Kernel , backgroundWorker);

 }

 private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

 {

 win.progressBar.Value = e.ProgressPercentage;

 }

 private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

 {

 win.Close();

 }

 }

 class StartParam

 {

 public Bitmap b = null;

 public IKernel k = null;

 public StartParam(Bitmap b, IKernel k)

 {

 this.b = b;

 this.k = k;

 }

 }

}

WaitForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace Kursach

{

 public partial class WaitForm : Form

 {

 BackgroundWorker bw;

 public WaitForm(BackgroundWorker bw)

 {

 InitializeComponent();

 this.bw = bw;

 }

 private void button1_Click(object sender, EventArgs e)

 {

 this.Close();

 }

 private void WaitForm_FormClosing(object sender, FormClosingEventArgs e)

 {

 if (bw.IsBusy)

 bw.CancelAsync();

 }

 }

}

KernelForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace Kursach

{

 public partial class KernelForm : Form

 {

 private bool allowEdit = false;

 public bool AllowEdit

 {

 get { return allowEdit; }

 set

 {

 allowEdit = value;

 kernelgrid.ReadOnly = !value;

 }

 }

 public KernelForm(bool editable, IKernel kernel)

 {

 InitializeComponent();

 for (int i = 0; i < kernel.Kernel.GetUpperBound(0) + 1; i++)

 {

 kernelgrid.Rows.Add();

 for (int j = 0; j < kernel.Kernel.GetUpperBound(1) + 1; j++)

 {

 kernelgrid.Rows[i].Cells[j].Value = kernel.Kernel.GetValue(i, j);

 }

 }

 this.Text = kernel.Text;

 AllowEdit = editable;

 }

 private void butCancel_Click(object sender, EventArgs e)

 {

 this.Close();

 }

 private void butOK_Click(object sender, EventArgs e)

 {

 DialogResult = DialogResult.OK;

 this.Close();

 }

 }

}

Filter.cs

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

using System.ComponentModel;

namespace Kursach

{

 static class Filter

 {

 public static Bitmap Filtering(Bitmap img, int[,] kernel, BackgroundWorker bw)

 {

 int[,] Mk = (int[,])kernel.Clone();

 int[] H = new int[kernel.Length];

 int counter = 0;

 for (int i = 0; i <= kernel.GetUpperBound(0); i++)

 for (int j = 0; j <= kernel.GetUpperBound(1); j++)

 H[counter++] = kernel[i, j];

 Bitmap ret = new Bitmap(img);

 int norma = Max(Sum(H), 1);

 for (int i = 2; i < img.Width - 2; i++)

 {

 for (int j = 2; j < img.Height - 2; j++)

 {

 int[] V = new int[25];

 for (int k = 0; k < V.Length; k++)

 V[k] = img.GetPixel(i - 1 + k / 5 - 1, j - 1 + k % 5 - 1).ToArgb();

 long mul = MulScalar(V, H);

 double d =(double)1 / (double)norma;

 double px = (d * mul);

 ret.SetPixel(i, j, Color.FromArgb((int)px));

 }

 bw.ReportProgress(100 * i / img.Width);

 if (bw.CancellationPending)

 return ret;

 }

 return ret;

 }

 private static int Sum(int[] arr)

 {

 int res = 0;

 foreach (int i in arr)

 res += i;

 return res;

 }

 private static int Max(int first, int second)

 {

 if (first > second)

 return first;

 else

 return second;

 }

 private static long MulScalar(int[] first, int[] second)

 {

 long res = 0;

 for (int i = 0; i < first.Length; i++)

 res += (first[i] * second[i]);

 return res;

 }

 }

}

Kernel.cs

using System;

using System.Collections.Generic;

using System.Text;

namespace Kursach

{

 public interface IKernel

 {

 int[,] Kernel

 {

 get;

 }

 string Text

 {

 get;

 }

 }

}

Kernels.cs

using System;

using System.Collections.Generic;

using System.Text;

namespace Kursach

{

 class Gradient : IKernel

 {

 #region IKernel Members

 public int[,] Kernel

 {

 get

 {

 return new int[,]

 { { 0, -1, 0, 1, 0},

 {-1, -2, 0, 2, 1},

 {-1, -2, 0, 2, 1},

 {-1, -2, 0, 2, 1},

 {0, -1, 0, 1, 0} };

 }

 }

 public string Text

 {

 get { return "Градиентный"; }

 }

 #endregion

 }

 class Laplacian : IKernel

 {

 #region IKernel Members

 public int[,] Kernel

 {

 get

 {

 return new int[,]

 { { -1, -1, -1, -1, -1},

 {-1, -1, -1, -1, -1},

 {-1, -1, 24, -1, -1},

 {-1, -1, -1, -1, -1},

 {-1, -1, -1, -1, -1}}; ;

 }

 }

 public string Text

 {

 get { return "Лапласиана"; }

 }

 #endregion

 }

 class Smoothing : IKernel

 {

 #region IKernel Members

 public int[,] Kernel

 {

 get

 {

 return new int[,]

 { { 1, 1, 1, 1, 1},

 {1, 1, 1, 1, 1},

 {1, 1, 0, 1, 1},

 {1, 1, 1, 1, 1},

 {1, 1, 1, 1, 1}};

 }

 }

 public string Text

 {

 get { return "Smoothing"; }

 }

 #endregion

 }

 class Gaussian : IKernel

 {

 #region IKernel Members

 public int[,] Kernel

 {

 get

 {

 return new int[,]

 {{ 1, 2, 4, 2, 1},

 {2, 4, 8, 4, 2},

 {4, 8, 16, 8, 16},

 {2, 4, 8, 4, 2},

 {1, 2, 4, 2, 1}};

 }

 }

 public string Text

 {

 get { return "Гаусовый"; }

 }

 #endregion

 }

 class Unknown : IKernel

 {

 #region IKernel Members

 public int[,] Kernel

 {

 get

 {

 return new int[,]

 { { 0, 0, 0, 0, 0},

 {0, 0, 0, 0, 0},

 {0, 0, 0, 0, 0},

 {0, 0, 0, 0, 0},

 {0, 0, 0, 0, 0}};

 }

 }

 public string Text

 {

 get { return "Произвольный"; }

 }

 #endregion

 }

}

Program.cs

using System;

using System.Collections.Generic;

using System.Windows.Forms;

namespace Kursach

{

 static class Program

 {

 /// <summary>

 /// The main entry point for the application.

 /// </summary>

 [STAThread]

 static void Main()

 {

 Application.EnableVisualStyles();

 Application.SetCompatibleTextRenderingDefault(false);

 Application.Run(new MainForm());

 }

 }

}


Страницы: 1, 2


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.