14759

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

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

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

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

Русский

2013-06-09

1.41 MB

21 чел.

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

Задание:

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

  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 одновременно:

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


 

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

52387. Сценарий праздника “Прощанье с букварем” 65.5 KB
  Учитель. Дорогие гости! Сегодня мы проводим традиционный праздник в первом классе – Праздник Букваря. Говорят, Азбука – к мудрости ступенька. Вот вы и одолели самую трудную, самую важную первую ступеньку на пути к знаниям! Много праздников прекрасных На листках календаря, А меж ними тоже праздник Школьный – праздник Букваря.
52388. Праздник «Прощай, Букварик» 101.5 KB
  Многие из вас не умели читать и писать знали только некоторые буквы. Мы при расставании скажем на прощанье: Тебе за всё спасибо наш дорогой Букварь Буквы мы узнали слоги прочитали И сложили в слоги целые слова После в предложенье. Вдруг на удивленье сразу получилось Родина моя А потом и мама та что моет раму Дети в мяч играют Речка небо лес А ещё в программе прочитали сами Буквы на экране Поле из чудес. Напишу в тетради не оценки ради Буквы алфавита и пример решу.
52389. Прощание с Букварём 60.5 KB
  Букварь Книга для чтения. Плакат: Спасибо тебе Букварь Модель золотого ключика Диалог между мальчиком и девочкой В зале у нас суматоха и шум шёпот движения споры. Мы закончили первую школьную книгу букварь. А научил Вас читать и писать наш умный интересный и добрый друг букварь.
52390. Праздник «ПРОЩАЙ, БУКВАРЬ» 110 KB
  За год наши звездочки подросли поумнели многому научились и стали настоящими звездами а настоящие звезды ездят только в лимузинах вот посмотрите сами и вот подъехал лимузин и по красной дорожке идут наши звезды встречайте Музыкальная заставка Дети идут по звездной дорожке репортеры берут у них интервью Репортер: Скажите трудным для вас был первый год учебы Ученик: ответ Смех и слезы радость и печаль За год довелось нам испытать Но стараний...
52391. ПРАЗДНИК БУКВАРЯ 197 KB
  Учитель. Звучат позывные передачи В гостях у сказки Учитель: Ребята посмотрите кто же это пришёл к нам в гости Это же всех букв государь его величество Букварь. Основная часть Учитель: Ребята сегодня мы с вами подведем итог. Учитель: Друзья страны АБеВеГеДейки нигде на карте нет Но все в АБеВеГеДейку стремятся с детских лет.
52393. С++ для начинающих 2.85 MB
  Мы также коснемся областей видимости класса вложенных классов и классов как членов пространства имен. В главе 14 детально исследуются средства имеющиеся в С для инициализации и...
52394. What Do You Know about Canada? 590 KB
  Right you are. At this lesson we’ll try to make a report in geography of Canada. We have invited to our English lesson your geography teacher as an expert in Geography. This lesson is unusual because you’ll get knowledge yourselves using different sources of information.