Обработка сигналов и изображений в среде разработки MS Visual Studio 2010

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 15.12.2012
Размер файла 3,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ, МОЛОДЕЖИ И СПОРТА УКРАИНЫ

«ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» КАФЕДРА АВТОМАТИЗОВАННЫХ СИСТЕМ УПРАВЛЕННЯ

КУРСОВОЙ ПРОЕКТ

По дисциплине: «Обработка сигналов и изображений»

На тему: Обработка сигналов и изображений в среде разработки MS Visual Studio 2010

Студента

Терешкина Ю.С.

г. Донецк - 2012

СОДЕРЖАНИЕ

Введение

1. Описание используемых методов

1.1 Яркость точки и гистограммы изображения

1.2 Изменение яркости и контрастности

1.3 Бинаризация

1.4 Преобразование к оттенкам серого

1.5 Негатив

1.6 Наложение шумов на изображение

1.7 Виды шумов

1.8 Общее положение о фильтрации

1.9 Фильтрация методом альфа усечённых средних

1.10 Оператор К ближайших соседей

2. Пошаговые алгоритмы используемых методов

2.1 Расчёт таблицы яркости, построение гистограммы

2.2 Бинаризация (переход к чёрно белому)

2.3 Преобразование к оттенкам серого

2.4 Перевод в негатив

2.5 Наложение шумов на изображение

2.5.1 Алгоритм наложение аддитивного шума

2.5.2 Алгоритм наложения мультипликативного шума

2.5.3 Алгоритм наложения импульсного шума

2.6 Фильтрация методом альфа усечённых средних

3. Описание программы

4. Результаты

Список литературы

Приложение

программа изображение шум фильтрация

ВВЕДЕНИЕ

Решение многих проблем науки и практики приводит к необходимости извлечения полезной информации из различного рода многомерных данных, которые, по аналогии с оптическими изображениями, будем называть многомерными изображениями (МИ) или просто изображениями (И). Такие задачи возникают в очень многих областях знаний: в медицине, радио-, тепло- и гидролокации, исследовании Космоса и Земли, телевидении и т. д. Например, диагностика различных заболеваний по изображениям внутренних органов человека, обнаружение лесных пожаров, поиск перспективных для ловли рыбы акваторий, оценка экологического состояния регионов, навигационные задачи и так далее

Характерно, что эти задачи приходится решать при наличии различного рода мешающих факторов - помех, мешающих изображению, переменчивости условий наблюдения, динамики наблюдаемого объекта, взаимного перемещения приемника и объекта и т. п. Полезный сигнал может быть очень слаб по отношению к помехам и визуально неразличим на фоне мешающих изображений.

Нередко объем исходных данных очень велик (глобальный мониторинг Земли, массовые медицинские обследования), они поступают с большой скоростью и требуют обработки в режиме реального времени. Оператор не в состоянии справиться с таким потоком информации.

Единственным выходом из такой ситуации является компьютерная обработка изображений. Для этого необходимо создание соответствующих математических методов описания и обработки изображения, а также программного обеспечения применительно к конкретным задачам.

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

1. ОПИСАНИЕ ИСПОЛЬЗУЕМЫХ МЕТОДОВ

1.1 Яркость точки и гистограммы изображения

Яркость точки находится по формуле, коэффициенты которой определяются свойствами человеческого зрения:

Гистограммой в данном случае называется так или иначе представленная (например, в виде столбчатой диаграммы) зависимость числа повторений того/иного значения яркости на всём изображении от этого самого значения (то есть сколько раз встречается абсолютно чёрная точка, абсолютно белая и др.). Иными словами, один столбец гистограммы показывает, сколько пикселей текущего уровня яркости присутствует на всем изображении. При этом можно рассматривать 4 гистограммы: по 3 каналам и по вычисленной яркости.

1.2 Изменение яркости и контрастности

Эти изменения можно обобщить выражением «изменение баланса изображения», так как яркость и контрастность схожи, и относятся к сфере восприятия изображения человеком.

Повышение/снижение яркости - это, соответственно, сложение/вычитание значения каждого канала с некоторым фиксированным значением в пределах от 0 до 255. Обязательно необходимо контролировать выход нового значения канала за пределы диапазона 0.255.

Повышение/снижение контрастности - это, соответственно, умножение/деление значения каждого канала на некоторое фиксированное значение. Это ведет к изменению соотношений между цветами и, соответственно, к более чётким цветовым границам. На практике существует такой принцип: изменение контрастности не должно приводить к изменению средней яркости по изображению, поэтому пользуются следующей формулой:

NewY:=K*(OldY-AveY)+AveY

В этой формуле NewY - новое значение одного из каналов,

K - коэффициент контрастности (K=(0..1) - снижение, K<1 - повышение контрастности),

OldY - текущее значение того же канала,

AveY - среднее значение того же канала по изображению. Коррекция нового значения при выходе его за пределы 0..255 обязательна.

1.3 Бинаризация

Бинаризация - это преобразование изображения, в общем случае, к одноцветному (чаще всего к черно-белому). При выполнении бинаризации выбирается некий порог (например, посередине), все значения ниже которого превращаются в цвет фона, а выше - в основной цвет. Само преобразование можно осуществлять по каналам, но в этом случае результирующее изображение не будет в прямом смысле бинарным (чёрно-белым), а будет содержать 8 чистых цветов, представляющих собой комбинации чистых красного, зелёного и голубого цветов, то есть будет бинарным по каналам. Поэтому лучше проводить преобразование над «полным» цветом точки.

1.4 Преобразование к оттенкам серого

Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной ранее формуле

Y:=0.3*R+0.59*G+0.11*B,

а также в последующем копировании полученного значения в каждый из каналов RGB.

1.5 Негатив

Получение негатива происходит простой заменой каждого значения канала на его дополнение до 255. Например, R=255-R.

1.6 Наложение шумов на изображение

Шум изображения - это дефект качества цифрового снимка, который возникает из-за неправильной передачи цвета и яркости.

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

1.7 Виды шумов

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

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

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

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

1.8 Общее положение о фильтрации

Для начала введём один специальный термин: апертура фильтра - это размер окна (части изображения), с которым фильтр работает непосредственно в данный момент времени; окно это постепенно передвигается по изображению слева направо и сверху вниз на один пиксель. Фильтр может быть рекурсивным и не рекурсивным, это зависит от его реализации. Рекурсивный фильтр на каждом следующем шаге работает с окном, состоящим не только из элементов исходного изображения, но и из элементов, ранее подвергнувшихся преобразованию, - своего рода «принцип снежного кома». Не рекурсивный фильтр работает только с элементами исходного изображения.

Кроме того, заметим, что если речь идёт об окне, представляющем собой строку элементов изображения то такое преобразование называется одномерным; соответственно, существует и двумерное преобразование:

1.9 Фильтрация методом оператора альфа усеченных средних

Берет среднее значение из остающихся значений в упорядоченном списке, если первые и последние элементы в списке (первоначально содержащем n значений) отброшены. Это то же, что и оператор k ближайших соседей при Поэтому для определения среднего значения можно будет воспользоваться той же функцией, по которой было определено K ближайших соседей.

1.10 Оператор К ближайших соседей

Проводит осреднение только по k ближайшим по величине соседям центрального значения из упорядоченного списка. Значение k обычно устанавливается таким (5 или 6 для маски 3x3), что углы и тонкие линии сильно разрушаются. Это делается не специально, но меньшие значения будут плохо бороться с шумом.

2. ПОШАГОВЫЕ АЛГОРИТМЫ ИСПОЛЬЗУЕМЫХ МЕТОДОВ

2.1 Расчет таблицы яркостей. Построение гистограмм

Для расчёта таблицы яркостей:

1) Объявляем матрицу целочисленных значений, с размером по вертикали и горизонтали, равным количеству пикселей изображения по вертикали и горизонтали.

2) Организуем два вложенных цикла для прохода по каждому пикселю изображения. 3) С помощью функции GetPixel получаем значение яркости по каналам R,G,B для текущего пикселя.

4) Затем по формуле Br = 0.3R + 0.59G + 0.11B находим суммарную яркость пикселя по трём каналам и записываем значение Br в соответствующую ячейку матрицы яркости.

Построение гистограммы яркости изображения:

1) Объявляем одномерный массив целочисленных значений с количеством элементов 256.

2) Организуем два вложенных цикла для прохода по элементам матрицы яркости.

3) Считываем значение яркости из матрицы, и это значение будет являться индексом одномерного массива, в ячейке которого значение увеличиваем на единицу.

Таким образом, пройдя по всем элементам матрицы яркости мы получим в одномерном массиве количество пикселей с каждым уровнем яркости от 0 до 255.

4) По оси Ох гистограммы откладываем значение от 0 до 255 (уровень яркости), а по оси Оу значение из одномерного массива с количеством пикселей каждого уровня яркости.

Для построения гистограмм по каналам R,G,B. Проделываем все аналогично, только одномерный массив строим по яркости отдельного канала из R,G,B.

2.2 Бинаризация переход к чёрно-белому

Бинаризация - это преобразование изображения, в общем случае, к одноцветному (чаще всего к черно-белому).

Для проведения бинаризации нужно выбрать значение порога бинаризации такое, чтобы не потерять детали изображения. Все значения из таблицы яркости, которые выше порога бинаризации преобразуется в цвет фона (белый), а значение яркости которое ниже порога бинаризации преобразуются в основной цвет (чёрный).

Алгоритм бинаризации работает следующим образом:

1) Организуем два вложенных цикла для прохода по матрице яркости.

2) Сравниваем значение яркости текущего пикселя изображения с установленным порогом бинаризации.

3) Если значение яркости больше уровня бинаризации, то с помощью функции SetPixel устанавливаем цвет пикселя, редактируемого изображения, в цвет фона - белый цвет.

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

2.3 Преобразование к оттенкам серого

Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле

(Y=0.3*R+0.59*G+0.11*B)

и последующем копировании полученного значения по все три канала (R=G=B=Y).

Алгоритм преобразования к оттенкам серого работает следующим образом:

1) Организуем два вложенных цикла для прохода по матрице яркости.

2) Копируем значение из таблицы яркости, при помощи функции SetPixel во все три канала R,G,B таким образом получаем изображение с оттенками серого.

2.4 Перевод в негатив

Негатив получается простой заменой значения каждого канала на его дополнение до 255 (например, R=255-R). Алгоритм преобразования в негатив работает следующим образом: организуем два вложенных цикла для прохода по матрице яркости. Каждому из пикселей по всем трем каналам RGB присваиваем новое значение, являющееся дополнением старого до 255.

R = 255 - R

G = 255 - G

B = 255 - B

2.5 Наложение шумов на изображение

2.5.1 Алгоритм наложения аддитивного шума

Алгоритм наложения аддитивного шума заключается в увеличении яркости или значения цвета пикселя на некоторую небольшую величину.

1) Формируем количество зашумлённых пикселей случайным образом (в приделах от двойного количества пикселей по ширине до количества пикселей по ширине умноженных на 4)

2) Генерируем цикл по количеству точек пикселей зашумления определённых в пункте 1.

3) Для случайного расположения пикселя генерируем его координаты х, у, случайным образом

4) Изменяем значение яркости каждого канала на случайную величину в приделах от -40 до +40

5) Проверяем значение каждого канала яркости, чтобы оно не вышло за границы 0-255.

6) Заменяем значение пикселя на зашумлённое.

2.5.2 Алгоритм наложения мультипликативного шума

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

2.5.3 Алгоритм наложения импульсивного шума

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

Алгоритм импульсного шума подобен алгоритму аддитивного зашумления и отличается тем, что значения яркости канала RGB зашумлённого пикселя вычисляются случайным образом в пределах от 0 до 255.

2.6 Фильтрация методом оператора альфа усеченных средних

Берет среднее значение из остающихся значений в упорядоченном списке, если первые и последние элементы в списке (первоначально содержащем n значений) отброшены. Это то же, что и оператор k ближайших соседей при, поэтому для определения среднего значения можно будет воспользоваться той же функцией, по которой было определено K ближайших соседей. Коэффициент альфа принимает значение от 0.5 до 0.7

Алгоритм:

1) Организуем два вложенных цикла для прохода по всем пикселям изображения исключая граничные ряды пикселей (верхний, нижний, левый правый ряды пикселей изображения).

2) Определяем 3и линейных массива целых значений по 9 элементов, куда будут заноситься значение яркости по каналам RGB

3) В эти массивы заносим значение яркости текущего пикселя и восьми соседних с ним пикселей

4) Сортируем массивы яркости функцией Sort

5) Для получения усреднённого значения яркости по каналу используем функцию SearchNear.

Функция SearchNear работает следующим образом:

1) Функция получает массив из яркости 9 пикселей отдельного канала, индекс среднего элемента массива (в нашем случаи 4) и число К ближайших соседей которое нам надо взять для вычисление среднего значения.

К= n * alfa = 9 * 0.7 = 6

2) Далее эта функция накапливает в переменную значение шести ближайших соседей среднего элемента.

3) Затем она делит это число на К и возвращает усреднённое значение яркости по каналу.

4) Вычислим при помощи функции SearchNear значение по каждому каналу RGB. Помещаем средние значения на место центрального пикселя в окне фильтра.

3.ОПИСАНИЕ ПРОГРАММЫ

Данный курсовой проект работает на основе программы разработанной в среде разработки консольных и графических приложений Microsoft Visual Studio 2010 на объектное ориентированном языке C#. В данной программе существует возможность загрузки изображения с помощью выбора из меню программы. Так же данная программа может преобразовывать обычное изображение в группу методов:

- бинарное

- с оттенками серого

- негатив

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

- мультипликативный - аддитивный - импульсный

После наложения одного из видов шума работу фильтра будет гораздо заметнее, чем без него. Стоит заметить, что работа фильтра наложение шума и построение гистограммы изображения работает с помощью диалоговых окон (то есть взаимодействия между родительской формой и дочерней). Данная программа проста в использовании, но требует определённых ресурсных затрат персонального компьютера. Чем выше характеристики этого компьютера, тем быстрее выполняются методы и преобразования изображения в этой программе.

4. РЕЗУЛЬТАТЫ

Рисунок 4.1 - Главное окно программы

Рисунок 4.2 - Загрузка изображения

Рисунок 4.3 - Загрузка изображения (продолжение)

Рисунок 4.4 - Вывод на экран матрицы значений яркости изображения

Рисунок 4.5 - Построение гистограмм

Рисунок 4.6 - Бинаризация (переход к чёрно-белому)

Рисунок 4.7 - Переход к оттенкам серого

Рисунок 4.8 - Негатив

Рисунок 4.9 - Возможность изменения яркости

Рисунок 4.10 - Изменение контрастности изображения

Рисунок 4.11 - Наложения определённого шума

Рисунок 4.12 - Фильтрация методом альфа усечённых средних

СПИСОК ЛИТЕРАТУРЫ

1. Конспект лекций по курсу «Обработка сигналов и изображений»

2. Соловьев Н.В. «Обработка и распознавание изображений в системах превентивной безопасности»

3. А. Федоров «Бинаризация черно-белых изображений: состояние и перспективы развития»

4. Интернет источник: http://ru.wikipedia.org/

Приложение

Листинг программы

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace kursovoyOsi

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

Bitmap loadedImage, mainImage;

public Bitmap editedImage;

public int[,] MatrBright;

public int[] HistogrammBr, HistogrammR, HistogrammG, HistogrammB;

private void загрузитьИзображениеToolStripMenuItem_Click(object sender,EventArgs e)

{

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.InitialDirectory = "C:\\Users\\Public\\Pictures\\Sample Pictures\\";

openFileDialog1.Filter = "Изображение (*.jpg, *.bmp, *.png)|*.jpg;*.bmp;*.png";

openFileDialog1.FilterIndex = 2;

openFileDialog1.RestoreDirectory = true;

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

loadedImage = new Bitmap(@openFileDialog1.FileName);

editedImage = new Bitmap(@openFileDialog1.FileName);

mainImage = new Bitmap(@openFileDialog1.FileName);

pictureBox1.Image = mainImage;

pictureBox2.Image = null;

pictureBox2.Update();

pictureBox1.Update();

GetParamImage(mainImage);

}

}

//кнопка расчёты матрицы яркости

private void btnMB_Click(object sender, EventArgs e)

{

calculateMatrBright(mainImage);

}

//Расчёт матрицы значения яркости

void calculateMatrBright(Bitmap tmpImage)

{

int i, j;

int R, G, B;

MatrBright = new int[tmpImage.Width, tmpImage.Height];

System.IO.StreamWriter tofile = new System.IO.StreamWriter(@"G:/Матрица яркостей.txt");

for (i = 0; i < tmpImage.Width; i++)

{

for (j = 0; j < tmpImage.Height; j++)

{

//Получаем значение насыщенности каналов R, G, B

R = tmpImage.GetPixel(i, j).R;

G = tmpImage.GetPixel(i, j).G;

B = tmpImage.GetPixel(i, j).B;

//Заполняем таблицу яркостей значениями яркости пикселей

MatrBright[i, j] = (int)(0.3 * R + 0.59 * G + 0.11 * B);

tofile.Write(MatrBright[i, j] + " ");

if (MatrBright[i, j] < 10)

{ tofile.Write(" "); }

else if (MatrBright[i, j] < 100)

{ tofile.Write(" "); }

}

tofile.WriteLine();

}

tofile.Close();

}

//преобразование изображения к оттенкам серого

private void btnBW_Click(object sender, EventArgs e)

{

int i, j;

int Gray;

for (i =0; i < mainImage.Width; i++)

{

for (j =0; j < mainImage.Height; j++)

{

Gray = (int)(0.3* mainImage.GetPixel(i, j).R +0.59* mainImage.GetPixel(i, j).G +0.11* mainImage.GetPixel(i, j).B);

editedImage.SetPixel(i, j, Color.FromArgb(Gray, Gray, Gray));

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

}

//БИНАРИЗАЦИЯ ИЗОБРАЖЕНИЯ

private void bBS_Click_1(object sender, EventArgs e)

{

int value;

//Получаем значение уровня бинаризации

value = (int)numericUpDown1.Value;

//Бианризация переход к чёрно-белому изображению

double Bright;

int i, j;

for (i =0; i < mainImage.Width; i++)

{

for (j =0; j < mainImage.Height; j++)

{

//Получаем уровень яркости для преобразуемого пикселя

Bright =0.3*mainImage.GetPixel(i, j).R +0.59* mainImage.GetPixel(i, j).G +0.11* mainImage.GetPixel(i, j).B;

if ((int)Bright > value)

{

//Если яркость пикселя больше порогового значения

//Заполняем его белым цветом и сохраняем значение логической матрицы

editedImage.SetPixel(i, j, Color.White);

}

else

{

//Если яркость пикселя меньше порогового значения

//Заполняем его черным цветом и сохраняем значение логической матрицы

editedImage.SetPixel(i, j, Color.Black);

}

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

}

//негатив

private void Btn_Click(object sender, EventArgs e)

{

int i, j;

int Red, Green, Blue;

for (i = 0; i < mainImage.Width; i++)

{

for (j = 0; j < mainImage.Height; j++)

{

Red = mainImage.GetPixel(i, j).R;

Red = 255 - Red;

Green = mainImage.GetPixel(i, j).G;

Green = 255 - Green;

Blue = mainImage.GetPixel(i, j).B;

Blue = 255 - Blue;

editedImage.SetPixel(i, j, Color.FromArgb(Red, Green, Blue));

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

}

int CorrectColor(int C)

{

if (C > 255)

{

return 255;

}

else if (C < 0)

{

return 0;

}

else return C;

}

//функция увеличения яркости изображения

private void bbp_Click(object sender, EventArgs e)

{

int i, j;

//int Red, Green, Blue;

int R, G, B;

//toAdd - значение, на которое необходимо увеличить яркость изображения

for (i =0; i < mainImage.Width; i++)

{

for (j = 0; j < mainImage.Height; j++)

{

//Считываем уровни яркости RGB каждого пикселя

R = editedImage.GetPixel(i, j).R;

G = editedImage.GetPixel(i, j).G;

B = editedImage.GetPixel(i, j).B;

//Прибавляем к полученному значению фиксированный коэффициент

R = R + 10;

G = G + 10;

B = B + 10;

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

R = CorrectColor(R);

B =CorrectColor(B);

G =CorrectColor(G);

//Заменяем значения в пикселе

editedImage.SetPixel(i, j, Color.FromArgb(R, G, B));

}

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

//функция уменьшения яркости изображения

private void bbm_Click(object sender, EventArgs e)

{

int i, j;

//int Red, Green, Blue;

int R, G, B;

//toAdd - значение, на которое необходимо увеличить яркость изображения

for (i = 0; i < mainImage.Width; i++)

{

for (j = 0; j < mainImage.Height; j++)

{

//Считываем уровни яркости RGB каждого пикселя

R = editedImage.GetPixel(i, j).R;

G = editedImage.GetPixel(i, j).G;

B = editedImage.GetPixel(i, j).B;

//Прибавляем к полученному значению фиксированный коэффициент

R = R - 10;

G = G - 10;

B = B - 10;

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

R = CorrectColor(R);

B = CorrectColor(B);

G = CorrectColor(G);

//Заменяем значения в пикселе

editedImage.SetPixel(i, j, Color.FromArgb(R, G, B));

}

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

//функция увеличения яркости изображения

private void btyp_Click(object sender, EventArgs e)

{

int AveR = 0;

int AveG = 0;

int AveB = 0;

int i, j, R, G, B;

double K = 1.3;

for (i = 0; i < editedImage.Width; i++)

{

for (j = 0; j < editedImage.Height; j++)

{

//Находим сумму цветовых каналов для всего изображения

AveR = AveR + editedImage.GetPixel(i, j).R;

AveG = AveG + editedImage.GetPixel(i, j).G;

AveB = AveB + editedImage.GetPixel(i, j).B;

}

}

//Находимсреднеезначение

AveR = AveR / (editedImage.Width * editedImage.Height);

AveG = AveG / (editedImage.Width * editedImage.Height);

AveB = AveB / (editedImage.Width * editedImage.Height);

for (i = 0; i < editedImage.Width; i++)

{

for (j = 0; j < editedImage.Height; j++)

{

R = editedImage.GetPixel(i, j).R;

G = editedImage.GetPixel(i, j).G;

B = editedImage.GetPixel(i, j).B;

//Применяем формулу изменения контраста

//К - коэффициент преобразования

R = (int)((R - AveR) * K) + AveR;

G = (int)((G - AveG) * K) + AveG;

B = (int)((B - AveB) * K) + AveB;

R = CorrectColor(R);

G = CorrectColor(G);

B = CorrectColor(B);

editedImage.SetPixel(i, j, Color.FromArgb(R, G, B));

}

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

//функция уменьшения яркости изображения

private void btym_Click(object sender, EventArgs e)

{

int AveR = 0;

int AveG = 0;

int AveB = 0;

int i, j, R, G, B;

double K = 0.65;

for (i = 0; i < editedImage.Width; i++)

{

for (j = 0; j < editedImage.Height; j++)

{

//Находим сумму цветовых каналов для всего изображения

AveR = AveR + editedImage.GetPixel(i, j).R;

AveG = AveG + editedImage.GetPixel(i, j).G;

AveB = AveB + editedImage.GetPixel(i, j).B;

}

}

//Находимсреднеезначение

AveR = AveR / (editedImage.Width * editedImage.Height);

AveG = AveG / (editedImage.Width * editedImage.Height);

AveB = AveB / (editedImage.Width * editedImage.Height);

for (i = 0; i < editedImage.Width; i++)

{

for (j = 0; j < editedImage.Height; j++)

{

R = editedImage.GetPixel(i, j).R;

G = editedImage.GetPixel(i, j).G;

B = editedImage.GetPixel(i, j).B;

//Применяем формулу изменения контраста

//К - коэффициент преобразования

R = (int)((R - AveR) * K) + AveR;

G = (int)((G - AveG) * K) + AveG;

B = (int)((B - AveB) * K) + AveB;

R = CorrectColor(R);

G = CorrectColor(G);

B = CorrectColor(B);

editedImage.SetPixel(i, j, Color.FromArgb(R, G, B));

}

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

//функция К соседних элементов

int SearchNear(int[] M, int index, int k)

{

int rezultSumm =0;

int count = k;

int forward, backward;

//Отступаем на шаг вперед и назад от элемента, расположенного в центре окна (index равен середине выборки)

forward =1;

backward =-1;

//Выполняем, пока не найдем K ближайших элементов

while (count!=0)

{

//Если индексы шага вперед и назад находятся в пределах массива

if ((index + forward) < M.Length && (index + backward) >=0)

{

//Находим тот элемент, который менее отличается от центрального и суммируем его if (Math.Abs(M[index + forward] - M[index]) <=Math.Abs(M[index + backward] - M[index]))

{

rezultSumm= rezultSumm + M[index + forward];

forward++;

}

else

{

rezultSumm= rezultSumm + M[index + backward];

backward--;

}

}

//Если индекс шага назад вышел за пределы массива - суммируем только по шагу вперед

else if ((index + forward) <= M.Length && (index + backward) <0)

{

rezultSumm= rezultSumm + M[index + forward];

forward++;

}

//Если индекс шага вперед вышел за пределы массива - суммируем только по шагу назад

else

{

rezultSumm= rezultSumm + M[index + backward];

backward--;

}

count--;

}

//Находимсреднеезначение

rezultSumm= rezultSumm / k;

return rezultSumm;

}

//оператор альфа усечённых средних.

private void bop_Click(object sender, EventArgs e)

{

int i, j, k, m, count;

int[] R, G, B;

int Rc, Gc, Bc;

double alpha;

R =new int[9];

G =new int[9];

B =new int[9];

//Для примера возьмем альфа=0.7 (т.е. отсечется 30% крайних значений)

alpha =0.9;

//На элементы будет наложена матрица вида:

// 1 1 1

// 1 1 1

// 1 1 1

for (i =1; i < (editedImage.Width -1); i++)

{

for (j =1; j < (editedImage.Height -1); j++)

{

count =0;

//Считываем уровни всех пикселей для красного в окне фильтра

for (k =-1; k <=1; k++)

{

for (m =-1; m <=1; m++)

{

R[count] =mainImage.GetPixel(i + k, j + m).R;

G[count] =mainImage.GetPixel(i + k, j + m).G;

B[count] =mainImage.GetPixel(i + k, j + m).B;

count++;

}

}

//Выполняем сортировку полученных массивов при помощи стандартных методов С#

Array.Sort(R);

Array.Sort(G);

Array.Sort(B);

//Получаем среднее alpha*n ближайших соседей

Rc = SearchNear(R, 4, (int)(alpha *9));

Gc =SearchNear(G, 4, (int)(alpha *9));

Bc =SearchNear(B, 4, (int)(alpha *9));

//Помещаем средние значения на место центрального в окне фильтра

editedImage.SetPixel(i, j, Color.FromArgb(Rc, Gc, Bc));

}

pictureBox2.Image = editedImage;

pictureBox2.Update();

}

}

//Вывод на экран таблицы яркости

private void butBright_Click(object sender, EventArgs e)

{

if (mainImage.Width > 650 || mainImage.Height > 650)

{

MessageBox.Show("Изображение слишком велико для показа таблицы яркостей");

}

else

{

//Показываем окно с таблицей яркостей

BrightForm Brightes = new BrightForm(this, mainImage.Height, mainImage.Width);

Brightes.Show();

}

}

void GetParamImage(Bitmap tmpImage)

{

int i, j;

int R, G, B;

MatrBright = new int[loadedImage.Width, loadedImage.Height];

HistogrammBr = new int[256];

HistogrammR = new int[256];

HistogrammG = new int[256];

HistogrammB = new int[256];

for (i = 0; i < tmpImage.Width; i++)

{

for (j = 0; j < tmpImage.Height; j++)

{

//Получаем значение насыщенности каналов R, G, B

R = tmpImage.GetPixel(i, j).R;

G = tmpImage.GetPixel(i, j).G;

B = tmpImage.GetPixel(i, j).B;

//Заполняем таблицу яркостей значениями яркости пикселей

MatrBright[i, j] = (int)(0.3 * R + 0.59 * G + 0.11 * B);

//Находим количество пикселей каждого уровня яркости

HistogrammBr[MatrBright[i, j]]++;

//Находим количество пикселей каждого уровня насыщенности для R, G, B

HistogrammR[R]++;

HistogrammG[G]++;

HistogrammB[B]++;

}

}

}

//вызов дочерней формы по построению гистограммы

private void button1_Click(object sender, EventArgs e)

{

HistogrammForm HistForm = new HistogrammForm(this);

HistForm.Show();

}

//вызов дочерней формы наложения шума на изображение

private void button2_Click(object sender, EventArgs e)

{

//Показываем окно наложения шумов на изображение

NoiseForm NoisForm = new NoiseForm(this, pictureBox1.Size, (Bitmap)this.mainImage);

if (NoisForm.ShowDialog() == DialogResult.Yes)

{

pictureBox1.Image = mainImage;

mainImage = new Bitmap(editedImage);

pictureBox1.Refresh();

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.