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

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


 

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

48041. НОРМАЛЬНОЙ ФИЗИОЛОГИИ. МЕТОДИЧЕСКИЕ РАЗРАБОТКИ 342.5 KB
  Данное учебное пособие предназначено для студентов стоматологического факультета медицинских ВУЗов для самостоятельной работы на практических занятиях по нормальной физиологии. Задание для самостоятельной работы 1. Цель работы: познакомиться с принципами расчета параметров ПД при различных способах отведения. Ход работы: 1.
48045. Архитектура жилых и общественных зданий 157 KB
  Дипломный проект охватывает комплекс взаимосвязанных вопросов архитектурного проектирования. Постоянно увеличивающийся объем и широкий размах строительства в нашей стране требует очень большого числа специалистов в самых различных областях архитектурного творчества. Однако, как бы ни были разнообразны и актуальны задачи
48047. Методичні вказівки. Програмування 189.5 KB
  В ході самостійної підготовки, що передує курсовій роботі, вивчається лекційний та допоміжний матеріал, проводиться аналіз завдання, виконується розробка алгоритму його вирішення та підготовлюється вихідний текст програми на паперовому та електронному носії
48048. Генетика. Учебно-методическое пособие 505 KB
  Формы взаимодействия аллельных генов. Контролируются одной парой аллельных генов. Форма взаимодействия аллельных генов полное доминирование. Определите генотипы и фенотипы потомства при условии что форма взаимодействия аллельных генов полное доминирование.