14759

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

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

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

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

Русский

2013-06-09

1.41 MB

23 чел.

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

Задание:

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

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

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


 

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

26580. ПАСТЕРИЗАЦИЯ МОЛОКА. ИЗМЕНЕНИЕ В МОЛОКЕ ПРИ РАЗНЫХ РЕЖИМАХ ПАСТЕРИЗАЦИИ 5.9 KB
  ПАСТЕРИЗАЦИЯ МОЛОКА. Пастеризация следовательно наиболее простой и дешевый способ обеззараживания молока. При пастбищном содержании скота микрофлора молока уничтожается нагреванием более полно чем при стойловом содержании. Перед пастеризацией необходима тщательная очистка молока.
26581. КИСЛОМОЛОЧНЫЕ ПРОДУКТЫ, ИХ ПИЩЕВОЕ, ДИЕТИЧЕСКОЕ И ЛЕЧЕБНОЕ ЗНАЧЕНИЕ 6.01 KB
  Усвояемость кисломолочных продуктов выше усвояемости молока т. Регулярное употребление в пищу кисломолочных продуктов способствует и укреплению нервной системы изза накопления в них крайне необходимых человеку витаминов синтезируемых молочнокислыми бактериями. Установлено что содержание витаминов в кисломолочных продуктах возрастает в результате и спиртового брожения. молочнокислые бактерии содержащиеся в кисломолочных продуктах способны приживаться в кишечнике человека и благотворно влиять на весь организм.
26582. КЛАССИФИКАЦИЯ ПИЩЕВЫХ ЗАБОЛЕВАНИЙ 5.7 KB
  Само название пищевые заболевания пищевые токсикоинфекции пищевые токсикозы указывают что основную роль в их возникновении играют 'пищевые продукты. В зависимости от них все пищевые заболевания людей делят на две большие группы. ПИЩЕВЫЕ ЗАБОЛЕВАНИЯ НЕ БАКТЕРИАЛЬНОЙ ПРИРОДЫ типичные пищевые отравления. Пищевые заболевания не бактериальной природы с недостаточно изученной этиологией.
26583. КОНСЕРВИРОВАНИЕ КОЖЕВЕННОГО СЫРЬЯ 5.55 KB
  Шкуры консервируют посолом врасстил тузлукованием сухосоленым пресносухим и кислотносолевым способами. Шкуры укладывают на стеллажи мездрой вверх посыпая слоем соли до 1 см высотой штабеля 15 2 м. Каждый штабель комплектуют не более 3 суток с момента посола первой шкуры. Тузлукованием консервируют шкуры крупного рогатого скота конские верблюжьи и свиные.
26584. КОНСЕРВИРОВАНИЕ МЯСА ВЫСОКОЙ ТЕМПЕРАТУРОЙ. ВЕТСАНЭКСПЕРТИЗА И ГИГИЕНА ПРИГОТОВЛЕНИЯ БАНОЧНЫХ КОНСЕРВОВ. КОНСЕРВИРОВАНИЕ МЯСА И МЯСНЫХ ПРОДУКТОВ ВЫСОКОЙ ТЕМПЕРАТУРОЙ 16.98 KB
  Технология приготовления консервов сводится к тому что подготовленное мясо или другие продукты закладывают в жестяные или стеклянные герметически закрывающиеся банки которые подвергают стерилизации при температуре выше 100С. Консервный цех или завод имеет два основных отделения: 1 жестянобаночное где изготавливают банки и 2 технологическое в котором проводят все технологические операции при изготовлении консервов. Это необходимо при стерилизации банок когда под действием высокой температуры происходит расширение металла и содержимого...
26585. КОНСЕРВИРОВАНИЕ МЯСА ХОЛОДОМ. ИЗМЕНЕНИЕ В МЫШЕЧНОЙ ТКАНИ ПРИ ЗАМОРАЖИВАНИИ 14.63 KB
  Мясо по термическому состоянию согласно стандартам подразделяют на остывшее охлажденное подмороженное замороженное и оттаявшее. К остывшему относят мясо которое после разделки туши на глубине 8 см имеет температуру не выше 12 С. Остывшее мясо используют на предприятии где его получили вывоз для реализации ограничен исключение представляют продовольственные рынки. К охлажденному относят мясо температура в толще мышц которого не выше 4 С.
26586. ЛАБОРАТОРНЫЕ МЕТОДЫ РАСПОЗНОВАНИЯ МЯСА РАЗНЫХ ВИДОВ ЖИВОТНЫХ 5.55 KB
  ЛАБОРАТОРНЫЕ МЕТОДЫ РАСПОЗНОВАНИЯ МЯСА РАЗНЫХ ВИДОВ ЖИВОТНЫХ.По анатомоморфологическим особенностям туш скелета и внутренних органов убитых животных. Однако у одного и того же вида животных температура плавления жира колеблется в зависимости от пола типа кормления. СУЩНОСТЬ РЕАКЦИИ НА ГЛИКОГЕН ПО НИБЕЛЮ состоит в том что в мясе разных видов животных содержится неодинаковое количество гликогена: в парном мясе лошади более 2 в созревшем около 1 в мясе собаки 23.
26587. МЕРОПРИЯТИЯ ПРИ ОБНАРУЖЕНИИ СИБИРСКОЙ ЯЗВЫ НА СКОТОБАЗЕ МЯСОКОМБИНАТА 2.26 KB
  При обнаружении сиб.язвы после поголовного тщательного осмотра и поголовной термометрии в карантинном отделении неблагополучную партию делят на 2 группы: 1)больных и подозрительных по заболеванию и 2)подозреваемых в заражении
26588. МЕТОДЫ ВЫЯВЛЕНИЯ МЯСА БОЛЬНЫХ ЖИВОТНЫХ 18.96 KB
  МЕТОДЫ ВЫЯВЛЕНИЯ МЯСА БОЛЬНЫХ ЖИВОТНЫХ. У животных убитых в нормальном физиологическом состоянии место зареза неровное и интенсивнее пропитано кровью чем мясо в других местах туш; у животных убитых в агональном состоянии или разделанных после падежа место зареза ровное и пропитано кровью в такой же степени как и остальные мышцы. Удовлетворительное обескровливание наблюдают у старых переутомленных а иногда и больных животных. Плохо обескровлены как правило туши больных животных.