14759

Фильтрация изображений от импульсных помех

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы: фильтрация изображения от импульсных помех. Задание: Составить программу выполняющую фильтрацию изображения от импульсных помех. Необходимые характеристики: изображение хранится во внешнем файле; программно в изображение вносятся помехи то...

Русский

2013-06-09

1.41 MB

20 чел.

Цель работы: фильтрация изображения от импульсных помех.

Задание:

Составить программу, выполняющую фильтрацию изображения от импульсных помех.

  1.  Необходимые характеристики:
  2.  изображение хранится во внешнем файле;
  3.  программно в изображение вносятся помехи (точки, линии, ...);
  4.  программа должна выводить исходное и отфильтрованное изображения, должна присутствовать возможность выбора уровня зашумления, порога фильтра, размера окна.
  5.  Варианты (тип фильтра)
  6.  медианный фильтр. окно 1хN И Nx1. т.е. должен осуществляться проход изображения по строкам и столбцам (отдельно и вместе)

Код программы:

using System;

using System.Drawing;

using System.Windows.Forms;

using System.IO;

namespace TSOS_LAB1_Final

{

   public partial class Form1 : Form

   {

       public int N;

       public Bitmap original, work;

       public String bfType;

       public Int32 bfSize;

       public Int16 bfReserved1;

       public Int16 bfreserved2;

       public Int32 bfOffBits;

       public Int32 bfSizeheader;

       public Int32 bfShirinaImage;

       public Int32 bfVisotaImage;

       public Int16 bfNumberPlosk;

       public Int16 bfBitPixel;

       public Int32 bfCompress;

       public Int32 bfSizeRastMass;

       public Int32 bfGorSize;

       public Int32 bfVertSize;

       public Int32 bfNumberColors;

       public Int32 bfMainColors;

       public Form1()

       {

           InitializeComponent();

       }

       private void button1_Click(object sender, EventArgs e)

       {

           openFileDialog1.Filter = "bmp |*.bmp";

           openFileDialog1.ShowDialog();

           BinaryReader bReader = new BinaryReader(File.Open(openFileDialog1.FileName, FileMode.Open));

           bfType = new string(bReader.ReadChars(2));

           bfSize = bReader.ReadInt32();

           bfReserved1 = bReader.ReadInt16();

           bfreserved2 = bReader.ReadInt16();

           bfOffBits = bReader.ReadInt32();

           bfSizeheader = bReader.ReadInt32();

           bfShirinaImage = bReader.ReadInt32();

           bfVisotaImage = bReader.ReadInt32();

           bfNumberPlosk = bReader.ReadInt16();

           bfBitPixel = bReader.ReadInt16();

           bfCompress = bReader.ReadInt32();

           bfSizeRastMass = bReader.ReadInt32();

           bfGorSize = bReader.ReadInt32();

           bfVertSize = bReader.ReadInt32();

           bfNumberColors = bReader.ReadInt32();

           bfMainColors = bReader.ReadInt32();

           

           bReader.Close();

           String CompressType=0.ToString();

           if (bfCompress == 0 || bfCompress == 3 || bfCompress == 6)

               CompressType = "Без сжатия";

           else if (bfCompress == 1 || bfCompress == 2)

               CompressType = "RLE";

           else if (bfCompress == 4)

               CompressType = "JPEG";

           else if (bfCompress == 5)

               CompressType = "PNG";

           Bitmap original_image = new Bitmap(openFileDialog1.FileName);

           original = new Bitmap(openFileDialog1.FileName);

           work = new Bitmap(openFileDialog1.FileName);

           pictureBox1.Image = original_image;

           pictureBox1.Show();

           pictureBox2.Image = work;

           pictureBox2.Show();

#region fileInfo

           String message = "Сигнатура файла: " + bfType + "\n Размер файла: " + bfSize.ToString() +

                            "\n Местонахождение данных растрового массива: " + bfOffBits.ToString() +

                            "\n Длина заголовка растрового массива: " + bfSizeheader.ToString() +

                            "\n Ширина изобрадения: " + bfShirinaImage.ToString() + "\n Высота изображения: " +

                            bfVisotaImage.ToString() + "\n Число цевтовых плоскостей: " + bfNumberPlosk +

                            "\n Бит/пиксел: " + bfBitPixel + "\n Метод сжатия: " + CompressType +

                            "\n Длина растрового массива: " + bfSizeRastMass + "\n Горизонтальное разрешение: " +

                            bfGorSize + "\n Вертикальное разрешение: " + bfVertSize +

                            "\n Количество цветов изображения: " + bfNumberColors + "\n Количество основных цветов: " +

                            bfMainColors;

           

           MessageBox.Show(message);

#endregion

       }

#region Shum

       private void button2_Click(object sender, EventArgs e)

       {

           int lvlshum = 0;

           Random rand = new Random();

           if (radioButton1.Checked == true)

               lvlshum = 2000;

           else if (radioButton2.Checked == true)

               lvlshum = 7000;

           else if (radioButton3.Checked == true)

               lvlshum = 20000;

           for (int i =0; i<lvlshum; i++)

           {

               work.SetPixel(rand.Next(work.Width),rand.Next(work.Height),Color.White);

           }

           pictureBox2.Refresh();

       }

#endregion

       private void radioButton6_CheckedChanged(object sender, EventArgs e)

       {

       }

       private void button3_Click(object sender, EventArgs e)

       {

          N = Convert.ToInt32(textBox1.Text);

          if (radioButton4.Checked == true)

          {

              for (int i = 0; i < work.Width - N; i++)

              {

                  for (int j = 0; j < work.Height; j++)

                  {

                      median_filter(work, i, j);

                  }

              }

              pictureBox2.Refresh();

          }

          if (radioButton5.Checked == true)

          {

              for (int i=0;i<work.Width;i++)

              {

                  for (int j=0;j<work.Height-N;j++)

                  {

                      median_filter2(work,i,j);

                  }

              }

              pictureBox2.Refresh();

          }

           if (radioButton6.Checked == true)

               for (int i = 0;i<work.Width-N;i++)

               {

                   for (int j = 0; j < work.Height - N;j++)

                   {

                       median_filter(work, i, j);

                       median_filter2(work, i, j);

                   }

               }

           pictureBox2.Refresh();

       }

       private void median_filter(Bitmap my_bitmap, int x, int y)

       {

           int cR_, cB_, cG_;

           int k = 0;

           int n = N;

           

           int[] cR = new int[n + 1];

           int[] cB = new int[n + 1];

           int[] cG = new int[n + 1];

           

           for (int i = 0; i < n + 1; i++)

           {

               cR[i] = 0;

               cG[i] = 0;

               cB[i] = 0;

           }

           

           for (int i = x; i < x + N; i++)

           {

               

                   System.Drawing.Color c = my_bitmap.GetPixel(i, y);

                   cR[k] = System.Convert.ToInt32(c.R);

                   cG[k] = System.Convert.ToInt32(c.G);

                   cB[k] = System.Convert.ToInt32(c.B);

                   k++;

                   

               

           }

           

           

           Array.Sort(cR);

           Array.Sort(cG);

           Array.Sort(cB);

           int n_ = (int)(n / 2) + 1;

           cR_ = cR[n_];

           cG_ = cG[n_];

           cB_ = cB[n_];

           

           my_bitmap.SetPixel(x, y, System.Drawing.Color.FromArgb(cR_, cG_, cB_));

       }

       private void median_filter2(Bitmap my_bitmap, int x, int y)

       {

           int n;

           int cR_, cB_, cG_;

           int k = 0;

           n = N;

           int[] cR = new int[n + 1];

           int[] cB = new int[n + 1];

           int[] cG = new int[n + 1];

           for (int i = 0; i < n + 1; i++)

           {

               cR[i] = 0;

               cG[i] = 0;

               cB[i] = 0;

           }

           for (int j = y; j < y + N; j++)

           {

               System.Drawing.Color c = my_bitmap.GetPixel(x, j);

               cR[k] = System.Convert.ToInt32(c.R);

               cG[k] = System.Convert.ToInt32(c.G);

               cB[k] = System.Convert.ToInt32(c.B);

               k++;

           }

           Array.Sort(cR);

           Array.Sort(cG);

           Array.Sort(cB);

           int n_ = (int)(n / 2) + 1;

           cR_ = cR[n_];

           cG_ = cG[n_];

           cB_ = cB[n_];

           my_bitmap.SetPixel(x, y, System.Drawing.Color.FromArgb(cR_, cG_, cB_));

       }

   }

}

Скриншоты:

Отрытие файла:


Добавление шумов:

Примение фильтра 1xN:


Применение фильтра Nx1:

Примение фильтров 1xN и Nx1 одновременно:

Вывод: в ходе работы изучили методы фильтрации изображений от импульсных помех.


 

А также другие работы, которые могут Вас заинтересовать

55805. Зображення людини в русі. Різні художні техніки як засіб передачі руху людської фігури 610 KB
  Тема уроку з образотворчого мистецтва: Зображення людини в русі. Обладнання уроку: музичні записи навчальні роботи з методичного фонду магнітна дошка з рухомими моделями людських фігур таблиця пропорцій тіла людини репродукції зображень мистецьких творів...
55806. РУХ КРОВІ ПО СУДИНАХ 61.5 KB
  Мета уроку: обговорити з учнями можливі причини руху крові по судинах і зміни тиску крові; навчити вимірювати частоту пульсу і артеріальний тиск в стані спокою і після фізичного навантаження.
55807. ЦЕЛИТЕЛЬНАЯ СИЛА РУК ЧЕЛОВЕКА 132 KB
  Слайд-шоу Слово мудра в переводе с санскрита – это особое положение рук и пальцев рук по строго определённым канонам законам. Мудра Раковина Эта мудра полезна при любых заболеваниях горла гортани а также охриплости голоса.
55809. ТВЕРЖДЕНИЕ ЯРОСЛАВА. РАСЦВЕТ РУСИ 70 KB
  ЦЕЛЬ: рассмотреть внешнюю и внутреннею политику Ярослава Мудрого раскрыть её противоречия: рассмотреть изменения произошедшие в государстве в период его правления; установить хронологическую последовательность событий...
55810. КУЛЬТУРА КИЇВСЬКОЇ РУСІ КІНЦЯ Х – ПОЧАТКУ ХІ СТ 87.5 KB
  Мета: дати уявлення про розвиток писемності та рівень освіченості населення Київської Русі; ознайомити з найвизначнішими пам’ятками цього періоду; охарактеризувати розвиток мистецтва...
55811. Київська Русь за Ярославичів 37.5 KB
  Мета: з’ясувати яким було становище держави за часів Ярославичів;чому точилася боротьба Ярославичів за Київський стіл чи перебувала Київська Русь на межі феодальної роздробленості визначити з якою метою збиралися з’їзди князів та які рішення приймалися; розвивати логічне та історичне мислення школярів; виховувати в учнів інтерес до історії своєї держави. Очікувані результати: учні зможуть: характеризувати становище держави за часів Ярославичів пояснити причини боротьби князів за Київський стіл називати мету та рішення князівських...
55812. Княжа Русь-Україна в літописних оповіданнях 89.5 KB
  А чиїми літературноісторичними дорогами ми будемо мандрувати ви скажете нам самі розгадавши ключове слово нашого кросворду а допоможуть вам знання які ви здобули на уроках історії та української літератури з тем Княжа Русь Україна...
55813. Повторювально - узагальнюючий урок з теми «Княжа Русь-Україна» 46 KB
  Запитання Хто автор Повісті минулих літ Хто княжив у Києві до приходу Олега Хто прибив щит на воротах Константинополя З якої династії походив князь Ігор Назвіть ім’я князя який загинув від рук древлян. Який князь загинув у боротьбі з печенігами Хто і коли запровадив християнство на Русі Як називається перший збірник законів на Русі Хто його автор Хто і коли остаточно розгромив печенігів Як називався перший кам’яний храм Київської Русі Назвіть ім’я доньки князя Ярослава Мудрого яка стала королевою Франції....