14759

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

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

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

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

Русский

2013-06-09

1.41 MB

22 чел.

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

Задание:

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

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

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


 

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

42142. Задачі лінійної оптимізації в системі Maple 213 KB
  Задачі оптимізації в Maple розв’язуються за допомогою вбудованих функцій minimize та maximize, що входять до пакету Simplex.Класична задача лінійного програмування записується у такому форматі:minimize (цільова функція, {обмеження}, NONNEGATIVE).Останній параметр вказує на невід’ємність змінних, що входять до математичної моделі задачі. Для геометричної інтерпретації задачі оптимізації необхідно підключити пакет plots і задати систему лінійних нерівностей задачі, використовуючи процедуру inequal.
42143. ПАРНАЯ РЕГРЕССИЯ 338.5 KB
  модель вида yi = 0 1 xi i где yi значение зависимой переменной для наблюдения i xi значение независимой переменной для наблюдения i 0 и 1 коэффициенты регрессии εi значение случайной ошибки для наблюдения i n число наблюдений. Оценки коэффициентов парной линейной регрессии и определяются методом наименьших квадратов МНК. Оценки коэффициентов уравнения регрессии полученные МНК могут обладать следующими свойствами: несмещенность состоятельность эффективность. Содержание МНК свойств оценок полученных...
42144. ОПРЕДЕЛЕНИЕ ЭЛЕКТРОДВИЖУЩЕЙ СИЛЫ МЕТОДОМ КОМПЕНСАЦИИ 51 KB
  Для существования стационарного тока в цепи необходим какой-нибудь источник энергии электродвижущей силы ЭДС который способен поддерживать электрическое поле. В источнике ЭДС перемещение носителей заряда производится с помощью запасенной энергии. Рассмотрим замкнутую цепь состоящую из источника ЭДС и нагрузки внешней цепи. Таким образом ЭДС это физическая величина численно равная работе сторонних сил по перемещению единичного положительного заряда по замкнутой цепи.
42145. ОПРЕДЕЛЕНИЕ СОПРОТИВЛЕНИЯ С ПОМОЩЬЮ МОСТА УИТСТОНА 81 KB
  Сопротивления R1 R2 R0 Rх называются плечами моста Rх  измеряемое неизвестное R0 известное R1 R2 регулировочные сопротивления. Сопротивления плеч моста измеряют и подбирают таким образом чтобы ток гальванометра был равен нулю. Для однородного проводника сопротивления отдельных его участков относятся как их длины.
42146. ОПРЕДЕЛЕНИЕ НЕИЗВЕСТНОЙ ЕМКОСТИ КОНДЕНСАТОРА С ПОМОЩЬЮ МОСТА СОТТИ 80.5 KB
  В настоящей работе измерение электрической емкости осуществляется с помощью моста переменного тока  моста Сотти рис. Плечи моста плечо моста это участок цепи включенный между двумя узлами включают конденсатор неизвестной емкости Сх конденсатор эталонной емкости Сэ и два резистора имеющих сопротивления R1 и R2. В диагональ СD моста включают источник переменного напряжения трансформатор.
42147. ОПРЕДЕЛЕНИЕ НЕИЗВЕСТНОЙ ИНДУКТИВНОСТИ С ПОМОЩЬЮ МОСТИКА МАКСВЕЛЛА 73.5 KB
  ПОСТАНОВКА ЗАДАЧИ В настоящей работе измерение индуктивности осуществляется с помощью моста переменного тока  моста Максвелла рис.Плечи моста состоят из эталонной индуктивности L0 неизвестной индуктивности Lх их сопротивлений R R двух резисторов имеющих сопротивления R1 и R2. Принцип измерения индуктивности катушки Lх при помощи мостика Максвелла основан на подборе такого значения отношения сопротивлений при котором ток через гальванометр отсутствует.
42148. ЭЛЕКТРОПРОВОДНОСТЬ МЕТАЛЛОВ 110 KB
  Экспериментальная проверка линейной зависимости тока от напряжения I = f U электросопротивления от длины цилиндрического проводника R = f  и расчет удельного сопротивления проводника. Если внутри проводника создано электрическое поле то каждый электрон ускоряется в течение времени свободного пробега . 5 Рассмотрим цилиндрический участок проводника постоянного сечения dS и длиной udt. Это векторная величина совпадающая по направлению со скоростью упорядоченного...
42149. ИЗУЧЕНИЕ ПРОЦЕССОВ ЗАРЯДА И РАЗРЯДА КОНДЕНСАТОРА 202.53 KB
  Изучение закономерностей заряда и разряда конденсатора.магазина сопротивлений МС магазин емкостей MEисточник питания ИП звуковой генератор ГЗ электронный осциллограф блок с конденсаторами. ПОСТАНОВКА ЗАДАЧИ Принципиальная электрическая схема для наблюдения процессов заряда и разряда конденсатора изображена на рис.
42150. ИЗУЧЕНИЕ РАБОТЫ ЭЛЕКТРОННОГО ОСЦИЛЛОГРАФА 2.06 MB
  ПОСТАНОВКА ЗАДАЧИ Назначение электронного осциллографа. Универсальные измерительные приборы предназначенные для исследования электронных процессов с помощью графического их воспроизведения на экране электроннолучевой трубки называются электронными осциллографами. Высокая чувствительность осциллографа позволяет изучать очень слабые колебания напряжения а большое входное сопротивление исключает влияние осциллографа на режим цепей к которым он подключается.