Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСИ / АСУ_Меркулова_Обработкаизобр_ Методичка к курсовому.docx
Скачиваний:
37
Добавлен:
03.03.2016
Размер:
216.12 Кб
Скачать

Наложение шума

Речь пойдёт, в основном, о фильтрах шумоподавления, но для того, чтобы можно было быстрее и нагляднее оценивать их работу, требуется реализовать ещё и возможность искусственного зашумления изображения.

В курсовой работе необходимо реализовать наложение трех видов шумов на изображение: аддитивного, мультипликативного и импульсного. Перед их рассмотрением необходимо знать, что выходное значение яркости необходимо корректировать при выходе его за границы 0...255. В примерах коррекция будет выполняться при помощи функции, описанной в пункте «Изменение яркости и контрастности»

Смысл аддитивного шума заключается в увеличении яркости или значения цвета пикселя на некоторую небольшую величину, значение которой должно быть различным (случайным) для каждой следующей точки. Рассмотрим следующий пример наложения аддитивного шума, в котором значения цвета некоторого количества точек будут изменены на величину ±40:

Bitmap rezultImage = new Bitmap(bmp);

int i, x, y, n;

int R, G, B;

Random rand = new Random();

//Формируем количество зашумленных пикселей

n = rand.Next(bmp.Width * 2, bmp.Width * 4);

i = 0;

while (i < n)

{

//Определяем случайное положение пикселя

x = rand.Next(0, bmp.Width);

y = rand.Next(0, bmp.Height);

//Изменяем каждую составляющую на случайное значение

R = bmp.GetPixel(x, y).R + rand.Next(-40, 40);

G = bmp.GetPixel(x, y).G + rand.Next(-40, 40);

B = bmp.GetPixel(x, y).B + rand.Next(-40, 40);

//Выполняем коррекцию цвета

R = CorrectColor(R);

G = CorrectColor(G);

B = CorrectColor(B);

//Заменяем значение цвета пикселя на зашумленное

rezultImage.SetPixel(x, y, Color.FromArgb(R, G, B));

i++;

}

Смысл мультипликативного шума заключается в умножении яркости или значения цвета пикселя на некоторую небольшую величину, значения которой близки к 1 и в каждой точке различны (случайны). Рассмотрим следующий пример наложения мультипликативного шума, в котором значения цвета некоторого количества точек будут изменены в 0.5…1.5 раза:

Bitmap rezultImage = new Bitmap(bmp);

int i, x, y, n;

int R, G, B;

Random rand = new Random(DateTime.Now.Millisecond);

//Формируем количество зашумленых пикселей

n = rand.Next(bmp.Width * 2, bmp.Width * 4);

i = 0;

while (i < n)

{

//Определяем случайное положение пикселя

x = rand.Next(0, bmp.Width);

y = rand.Next(0, bmp.Height);

//Получаем уровни RGB для пикселя

R = bmp.GetPixel(x, y).R;

G = bmp.GetPixel(x, y).G;

B = bmp.GetPixel(x, y).B;

//Умножаем каждую составляющую на случайное значение в пределах 0.5:1.5

R = (int)(R * (rand.NextDouble() + 0.5));

G = (int)(G * (rand.NextDouble() + 0.5));

B = (int)(B * (rand.NextDouble() + 0.5));

//Выполняем коррекцию цвета

R = CorrectColor(R);

G = CorrectColor(G);

B = CorrectColor(B);

//Заменяем значение цвета пикселя на зашумленное

rezultImage.SetPixel(x, y, Color.FromArgb(R, G, B));

i++;

}

Смысл импульсного шума заключается в искажении яркости или цвета пикселя настолько, что он теряет всякую информацию о своем неискаженном значении. Рассмотрим следующий пример наложения импульсного шума, в котором значения цвета некоторого цвета будут заменены новыми случайными значениями:

Bitmap rezultImage = new Bitmap(bmp);

int i, x, y, n;

int R, G, B;

Random rand = new Random(DateTime.Now.Millisecond);

//Формируем количество зашумленых пикселей

n = rand.Next(bmp.Width * 2, bmp.Width * 4);

i = 0;

while (i < n)

{

//Определяем случайное положение пикселя

x = rand.Next(0, bmp.Width);

y = rand.Next(0, bmp.Height);

//Задаем новые значения цвета для пикселя

R = rand.Next(0, 256);

G = rand.Next(0, 256);

B = rand.Next(0, 256);

//Заменяем значение цвета пикселя на искаженные

rezultImage.SetPixel(x, y, Color.FromArgb(R, G, B));

i++;

}