Алгоритмизации обработки изображений

 

Реферат


Пояснительная записка к курсовой работе: 23 страницы, 1 приложение, 12 рисунков.

Цель работы - практическое закрепление теоретической части курса и приобретение навыков алгоритмизации обработки изображений .

Яркость и контрастность, матрица яркостей, гистограмма, бинаризация, градации серого, негатив, наложение шумов, фильтрация.


СОДЕРЖАНИЕ


Введение

1.Лист заданий

.Описание поставленных задач

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

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

.3Бинаризация

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

.5Негатив

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

.7Метод ранговой фильтрации с оценкой середины диапазона

3.Алгоритмы используемых методов

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

.2Изменение баланса изображения

.3Бинаризация

.4Перевод в полутоновое изображение

.5Перевод в негатив

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

.7Метод ранговой фильтрации с оценкой середины диапазона

4.Описание разработанной программы

4.1Стартовое окно и загрузка изображеня

.2Получение матрицы яркостей и построение гистограмм

.3Изменение яркости и контрастности изображения

.4Бинаризация изображения

.5Перевод изображения в градации серого

.6Преобразование изображения в неагтив

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

.8Метод ранговой фильтрации с оценкой середины диапазона

Вывод

Список используемой литературы

Приложение А


Введение


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

При просмотре хорошей фотографии человек запоминает и воспринимает гораздо больше деталей, что еще раз доказывает важность хорошего качества изображения. Сейчас имеется достаточно большое количество техники, которая может сфотографировать объекты, которые мы видим, но результат не всегда может «порадовать глаз». Изображения могут быть сильно яркими или темными, «полинявшими», зашумленными и т.д. Этот курсовой проект посвящен тому, как избавиться от некоторых таких проблем и улучшить (хоть и не на много) качество изображения.

1. Лист задания


1.Вывод изображения на экран.

2.Вывод на экран матрицы значений яркости изображения.

.Построение гистограмм.

.Изменение цветности:

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

·переход к оттенкам серого;

·негатив

5.Возможность изменения яркости и контрастности.

6.Задание по варианту:

метод ранговой фильтрации с оценкой середины диапазона.


2.Описание поставленных задач


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


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

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


Гистограмма - это представленная зависимость числа повторений каждого значения яркости на всём изображении от этого самого значения. Для изображения можно рассматривать 4 вида гистограмм: 3 по каналам(RGB) и одну по вычисленной яркости.


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


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

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

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


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


В этой формуле NewY - новое значение одного из каналов, K - коэффициент контрастности (K=(0..1) - снижение, K<1 - повышение контрастности), OldY - текущее значение того же канала, AveY - среднее значение того же канала по изображению. Коррекция нового значения при выходе его за пределы 0..255 обязательна.


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


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


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


Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной ранее формуле Y:=0.3*R+0.59*G+0.11*B, а также в последующем копировании полученного значения в каждый из каналов RGB.


2.5 Негатив


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


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


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

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


2.7 Метод ранговой фильтрации с оценкой середины диапазона


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

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

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


3. Алгоритмы используемых методов


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


Чтобы построить таблицу яркостей необходимо рассчитать уровни яркости для каждого пикселя и занести полученные значения в матрицу(DataGridView в нашем случае). Для каждого пикселя применяем формулу



Где i, j - координаты пикселя, для которого находится уровень яркости, -уровни соответствующих каналов для данного пикселя.

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


3.2 Изменение баланса изображения


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

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

Для изменения контраста изображения необходимо для начала рассчитать среднее значение по каждому из каналов RGB для всего изображения.



Где N - количество пикселей, n-ширина, m-высота изображения, - уровни соответствующих каналов для пикселя по координатам .

После этого необходимо определить коэффициент преобразования K, а затем воспользоваться для значений каждого канала для каждого из пикселей формулами:



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

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


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

После преобразования изображение будет состоять только из пикселей двух цветов.


3.4 Перевод в полутоновое изображение


Преобразование изображения в полутоновое состоит в том, чтобы каждому пикселю по всем трем каналам RGB присвоить значение яркости этого пикселя. Поэтому сначала необходимо рассчитать яркость пикселя по формуле:



Затем полученное значение присваивается всем трем каналам:



В приведенных формулах i,j-координаты пикселя, - уровни соответствующих каналов для пикселя по координатам .

Данные преобразования необходимо выполнить для каждого пикселя для получения полутонового изображения.

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


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



Где -новые значения каналов, i,j-координаты пикселя.


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


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

Затем необходимо сформировать случайные координаты в пределах изображения для этих пикселей. После чего для одного либо нескольких каналов RGB каждого из пикселей сформировать новое случайное значение. После чего присваивать измененным каналам новые значения.


3.6.1 Наложение аддитивного шума

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

3.6.2 Наложение мультипликативного шума

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


3.6.3 Наложение импульсного шума

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


3.7 Метод ранговой фильтрации с оценкой середины диапазона


Для выполнения фильтрации необходимо для начала выбрать размер апертуры фильтра. Обычно она берется размерами 3х3, но иногда есть смысл взять апертуру и большего размера. В общем случае окно фильтра будет выглядеть следующим образом:



Маска для ранговой фильтрации имеет следующий вид (можно ее и не учитывать):



Для каждого шага фильтр будет находить минимум и максимум, и находить среднее между ними, по всем трем каналам.

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


4. Описание разработанной программы


.1 Стартовое окно и загрузка изображения


После запуска программы на экране появится форма, изображенная на рис. 4.1.1:


Рис. 4.1.1


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

на главной форме кликнув на кнопку «Загрузить изображение»;

зайти в «Меню->Файл->Открыть»;

горячей клавишей «Ctrl+O»;

Все эти три варианта приведут к появлению диалогового окна ,в котором можно выбрать изображения типа :*bmp, *.jpg, *.jpeg, *.png, *.tif, *.tiff. После загрузки изображения в программу оно будет отображено в окне главной формы, как показано на рис. 4.1.2:

Рис.4.1.2


4.2 Получение матрицы яркостей и построение гистограмм


Для получения матрицы яркостей загруженного ранее изображения необходимо кликнуть на кнопку «Матрица яркостей», после нескольких секунд ожидания на экране появится форма показанная на рис.4.2.3


Рис.4.2.3


В этих таблицах показаны значения яркостей по каждому пикселю, по трем каналам, а также выходной яркости. Любую из этих таблиц, при желании можно сохранить в Excel, перейдя в «Меню->Матрица->Сохранить_№».

Построение гистограмм можно выполнить двумя способами:

на главной форме нажать на кнопку «Построение гистограмм»;

после получения матриц яркостей в той же форме перейти в «Меню->Гистограмма->Построение»;

На экране появится форма, изображенная на рис. 4.2.4:


Рис.4.2.4


Все гистограммы также можно сохранить перейдя в «Меню->Гистограмма->Сохранение->Сохранить_№».


4.3 Изменение яркости и контрастности изображения


После загрузки изображения станут доступными бегунки «Яркость» и «Контрастность», при их перемещении будет происходить соответственно изменение яркости и контрастности(рис.4.3.1):

Рис.4.3.1


4.4 Бинаризация изображения


Перед началом бинаризации, необходимо выбрать порог бинаризации, который можно установить в поле рядом с кнопкой «Бинаризация»(рис.4.4.1):


Рис.4.4.1


После выбора порога и нажатия на кнопку «Бинаризация» изображение будет преобразовано и отображено в этом же окне(рис.4.4.2):


Рис.4.4.2

void bBinary_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_binary = (byte)numericUpDown1.Value;cc_r, cc_g, cc_b, cc_bright;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Вычисляем яркость_bright = (byte)Math.Round(cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//Устанавливаем в памяти компоненты цвета(белый или черный)(cc_bright > cc_binary)

{

*pixel_gr = 255;_gr++;

*pixel_gr = 255;_gr++;

*pixel_gr = 255;

}

{

*pixel_gr = 0;_gr++;

*pixel_gr = 0;_gr++;

*pixel_gr = 0;

}

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}}


4.5 Перевод изображение в градации серого


Здесь уже никакого порога нет, поэтому для перевода изображения в градации серого просто жмем на кнопку «Серое изображение» (рис.4.5.1):


Рис.4.5.1


private void bGray_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_r, cc_g, cc_b, cc_gray;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Вычисляем серый_gray = (byte)Math.Round(cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//Устанавливаем в памяти компоненты цвета

*pixel_gr = cc_gray;_gr++;

*pixel_gr = cc_gray;_gr++;

*pixel_gr = cc_gray;

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}}


4.6 Преобразование изображения в негатив


Как и в предыдущем случае, все очень просто, достаточно нажать на «Негатив» и вуаля(рис.4.6.1):


Рис.4.6.1

private void bNegative_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_r, cc_g, cc_b;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Устанавливаем в памяти компоненты цвета

*pixel_gr = (byte)(255 - cc_b);

//*pixel_gr++;

*(pixel_gr + 1) = (byte)(255 - cc_g);

//*pixel_gr++;

*(pixel_gr + 2) = (byte)(255 - cc_r);

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}

}

Все изменения, проведенные выше перечисленных пунктах можно сохранить на диск перейдя в «Меню->Сохранить», либо наоборот отменить все проделанные действия нажав на «Исходное изображение».


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


Как было упомянуто, выше в данной программе имеется возможность добавление трех видов шумов, для зашумления изображения необходимо перейти в «Меню->Наложение шумов» и выбрать требуемый шум, в результате получит такую картину (рис.4.7.1):


Рис.4.7.1


4.8 Метод ранговой фильтрации с оценкой середины диапазона


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


Рис.4.8.1


Если взять какое-либо другое изображение, то результат будет другим(рис.4.8.2):


До После

Рис.4.8.2


Для доказательства недостатка ранговой фильтрации на током изображении в данном проекте приведен еще один метод фильтрации (Медианная фильтрация, коротко она заключается в выборе среднего, но не в смысле среднего арифметического, а элемента, который расположен посредине(5 элемент) из упорядоченных девяти значений (в случае апертуры = 3х3)), результат его работы приведен на рис.4.8.3:


Рис.4.8.3


Полные алгоритмы перечисленных выше действий приведены в приложении А.

Выводы


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

Разработанная программа позволяет выполнять любую из поставленных задач, большинство действий не требуют никакого вмешательства пользователя, а происходят автоматически. Программа выполнена в среде разработки Visual Studio, на языке программирования C#.


Список используемой литературы


1.Методические указания к выполнению курсового проекта по курсу «Обработка сигналов и изображений»;

.Гонсалес Р., Вудс Р. - Цифровая обработка изображений;

.Яншин - Обработка изображений на языке Си;

.Ярославский - Введение в цифровую обработку изображений;

яркость изображение шум негатив

Приложение А


Листинг класса Form1.cs:

using System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Drawing.Imaging;Kursach

{partial class Form1 : Form

{bitmap1;graphics1, g;MemForImage;FLAG = 0, Z = 1;name, filename;Color selectionColor;Form2 = new DopForm();Form1()

{();

}void LoadImage(bool jpg)

{.InitialDirectory = "\;(jpg).Filter = "All Graphics Types|*.bmp;*.jpg;*.jpeg;*.png;*.tif;*.tiff";(openFileDialog1.ShowDialog() == DialogResult.OK)

{

{= Image.FromFile(openFileDialog1.FileName);.BackgroundImageLayout = ImageLayout.Zoom;.BackgroundImage = MemForImage;(Bitmap bmp = new Bitmap(pictureBox1.BackgroundImage))

{= GetDominantColor(bmp, false);= CalculateOppositeColor(selectionColor);

}


}(Exception ex)

{.Show("Ошибка при загрузке" + ex.Message);

}

}

}

/// <summary>

/// Returns the dominant color of an image

/// </summary>Color GetDominantColor(Bitmap bmp, bool includeAlpha)

{

// GDI+ still lies to us - the return format is BGRA, NOT ARGB.bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),.ReadWrite,.Format32bppArgb);stride = bmData.Stride;Scan0 = bmData.Scan0;r = 0;g = 0;b = 0;a = 0;total = 0;

{* p = (byte*)(void*)Scan0;nOffset = stride - bmp.Width * 4;nWidth = bmp.Width;(int y = 0; y < bmp.Height; y++)

{(int x = 0; x < nWidth; x++)

{+= p[0];+= p[1];+= p[2];+= p[3];++;+= 4;

}+= nOffset;

}

}.UnlockBits(bmData);/= total;/= total;/= total;/= total;(includeAlpha)Color.FromArgb(a, r, g, b);Color.FromArgb(r, g, b);

}

/// <summary>

/// Calculates the opposite color of a given color.

/// Source: #"justify">/// </summary>

/// <param name="clr"></param>

/// <returns></returns>Color CalculateOppositeColor(Color clr)

{Color.FromArgb(255 - clr.R, 255 - clr.G, 255 - clr.B);

}void button1_Click(object sender, EventArgs e)

{(true);.Text = "Яркость:";.Text = "Контраст:";.Enabled = true;.Value = 50;.Enabled = true;.Value = 50;

}void Form1_Load(object sender, EventArgs e)

{= new Bitmap(pictureBox1.Width, pictureBox1.Height);= Graphics.FromImage(bitmap1);

}void button2_Click(object sender, EventArgs e)

{rsl = MessageBox.Show("Хотите выйти?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);(rsl == DialogResult.Yes).Exit();

}void button3_Click(object sender, EventArgs e)

{_Click(sender, e);.построениеToolStripMenuItem_Click(sender, e);

}void button4_Click(object sender, EventArgs e)

{i, j, fl = 0;mycol;picture = new Bitmap(pictureBox1.BackgroundImage);[,] r = new int[picture.Height, picture.Width];[,] g = new int[picture.Height, picture.Width];[,] b = new int[picture.Height, picture.Width];[,] br = new int[picture.Height, picture.Width];.dataGridView1.Rows.Clear();.dataGridView1.Columns.Clear();.dataGridView2.Rows.Clear();.dataGridView2.Columns.Clear();.dataGridView3.Rows.Clear();.dataGridView3.Columns.Clear();.dataGridView4.Rows.Clear();.dataGridView4.Columns.Clear();(i = 0; i < picture.Height - 1; i++)

{(j = 0; j < picture.Width - 1; j++)

{= picture.GetPixel(j, i);[i, j] = mycol.R;[i, j] = mycol.G;[i, j] = mycol.B;[i, j] = Convert.ToInt16(mycol.R * 0.3 + mycol.G * 0.59 + mycol.B * 0.11);((mycol.R != mycol.G) || (mycol.G != mycol.B) || (mycol.R != mycol.B))= 1;

}

}.Minimum = 1;.Value = 1;.Step = 1;(fl == 0)

{.Maximum = picture.Height * picture.Width + picture.Width;.dataGridView1.RowCount = picture.Height;.dataGridView1.ColumnCount = picture.Width + 1;.dataGridView1.Columns[0].Name = "№";(j = 0; j < picture.Width - 1; j++)

{.dataGridView1.Columns[j + 1].Name = Convert.ToString(j + 1);.PerformStep();

}(i = 0; i < picture.Height - 1; i++)

{.dataGridView1.Rows[i].Cells[0].Value = Convert.ToString(i + 1);(j = 0; j < picture.Width - 1; j++)

{.dataGridView1.Rows[i].Cells[j + 1].Value = br[i, j];.PerformStep();

}

}.label10.Text = "1";

}

{.Maximum = 4 * (picture.Height * picture.Width) + 4* picture.Width;.dataGridView1.RowCount = picture.Height;.dataGridView1.ColumnCount = picture.Width + 1;.dataGridView1.Columns[0].Name = "№";.dataGridView2.RowCount = picture.Height;.dataGridView2.ColumnCount = picture.Width + 1;.dataGridView2.Columns[0].Name = "№";.dataGridView3.RowCount = picture.Height;.dataGridView3.ColumnCount = picture.Width + 1;.dataGridView3.Columns[0].Name = "№";.dataGridView4.RowCount = picture.Height;.dataGridView4.ColumnCount = picture.Width + 1;.dataGridView4.Columns[0].Name = "№";(j = 0; j < picture.Width - 1; j++)

{.dataGridView1.Columns[j + 1].Name = Convert.ToString(j + 1);.PerformStep();

}(j = 0; j < picture.Width - 1; j++)

{.dataGridView2.Columns[j + 1].Name = Convert.ToString(j + 1);.PerformStep();

}(j = 0; j < picture.Width - 1; j++)

{.dataGridView3.Columns[j + 1].Name = Convert.ToString(j + 1);.PerformStep();

}(j = 0; j < picture.Width - 1; j++)

{.dataGridView4.Columns[j + 1].Name = Convert.ToString(j + 1);.PerformStep();

}(i = 0; i < picture.Height - 1; i++)

{.dataGridView1.Rows[i].Cells[0].Value = Convert.ToString(i + 1);(j = 0; j < picture.Width - 1; j++)

{.dataGridView1.Rows[i].Cells[j + 1].Value = br[i, j];.PerformStep();

}

}(i = 0; i < picture.Height - 1; i++)

{.dataGridView2.Rows[i].Cells[0].Value = Convert.ToString(i + 1);(j = 0; j < picture.Width - 1; j++)

{.dataGridView2.Rows[i].Cells[j + 1].Value = r[i, j];.PerformStep();

}

}(i = 0; i < picture.Height - 1; i++)

{.dataGridView3.Rows[i].Cells[0].Value = Convert.ToString(i + 1);(j = 0; j < picture.Width - 1; j++)

{.dataGridView3.Rows[i].Cells[j + 1].Value = g[i, j];.PerformStep();

}

}(i = 0; i < picture.Height - 1; i++)

{.dataGridView4.Rows[i].Cells[0].Value = Convert.ToString(i + 1);(j = 0; j < picture.Width - 1; j++)

{.dataGridView4.Rows[i].Cells[j + 1].Value = b[i, j];.PerformStep();

}

}.label10.Text = "3";

}.Show();

}void button5_Click(object sender, EventArgs e)

{.Show();

}void button6_Click(object sender, EventArgs e)

{

{= Image.FromFile(openFileDialog1.FileName);.BackgroundImageLayout = ImageLayout.Zoom;.BackgroundImage = MemForImage;(Bitmap bmp = new Bitmap(pictureBox1.BackgroundImage))

{= GetDominantColor(bmp, false);= CalculateOppositeColor(selectionColor);

}

}(Exception ex)

{.Show("Ошибка при загрузке" + ex.Message);

}.Text = "Яркость:";.Text = "Контраст:";.Value = 50;.Value = 50;

}void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{gr = graphics1;pb = pictureBox1;= pb.CreateGraphics();savedialog = new SaveFileDialog();.Title = "Сохранить картинку как ...";.OverwritePrompt = true;.CheckPathExists = true;.Filter =.Filter = //"JPEG - Формат изображения|*.jpg";

"JPEG File(*.jpg)|*.jpg|" +

"Bitmap File(*.bmp)|*.bmp|" +

"GIF File(*.gif)|*.gif|" +

"TIF File(*.tif)|*.tif|" +

"PNG File(*.png)|*.png";.ShowHelp = true;r = pb.RectangleToScreen(pb.ClientRectangle);b = new Bitmap(r.Width, r.Height);g = Graphics.FromImage(b);.CopyFromScreen(r.Location, new Point(0, 0), r.Size);(savedialog.ShowDialog() == DialogResult.OK)

{

// Get the user-selected file namefileName = savedialog.FileName;

// Get the extensionstrFilExtn =.Remove(0, fileName.Length - 3);

// Save file.BackColor = System.Drawing.Color.Transparent;= strFilExtn;= fileName;

}(name)

{"bmp":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);;"jpg":.Save(filename);;"gif":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Gif);;"tif":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Tiff);;"png":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Png);;:;

}

{= new System.Diagnostics.Process();.process1.StartInfo.Domain = "";.process1.StartInfo.LoadUserProfile = false;.process1.StartInfo.Password = null;.process1.StartInfo.StandardErrorEncoding = null;.process1.StartInfo.StandardOutputEncoding = null;.process1.StartInfo.UserName = "";.process1.SynchronizingObject = this;.StartInfo.FileName = filename;.EnableRaisingEvents = true;.Start();

}{ }

}void button7_Click(object sender, EventArgs e)

{

сохранитьToolStripMenuItem_Click(sender, e);

}void button8_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_r, cc_g, cc_b, cc_gray;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Вычисляем серый_gray = (byte)Math.Round(cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//Устанавливаем в памяти компоненты цвета

*pixel_gr = cc_gray;_gr++;

*pixel_gr = cc_gray;_gr++;

*pixel_gr = cc_gray;

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}

}void button10_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_r, cc_g, cc_b;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Устанавливаем в памяти компоненты цвета

*pixel_gr = (byte)(255 - cc_b);

//*pixel_gr++;

*(pixel_gr + 1) = (byte)(255 - cc_g);

//*pixel_gr++;

*(pixel_gr + 2) = (byte)(255 - cc_r);

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}

}void button9_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);bitmap_data;bitmap_pixels;

{

//Блокируем участок в памяти_data = picture.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//Получаем указатель на первый пиксель_pixels = bitmap_data.Scan0;* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer();

//Указываем, что точка будет занимать 3 байтаbytes_per_pixel = 3;cc_binary = (byte)numericUpDown1.Value;cc_r, cc_g, cc_b, cc_bright;(int x = 0; x < picture.Width; x++)

{(int y = 0; y < picture.Height; y++)

{

//Вычисляем указатель на точку, которая соответствует координатам x, y* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Считываем 3 компонента цвета_b = *pixel_gr;_g = *(pixel_gr + 1);_r = *(pixel_gr + 2);

//Вычисляем яркость_bright = (byte)Math.Round(cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//Устанавливаем в памяти компоненты цвета(белый или черный)(cc_bright > cc_binary)

{

*pixel_gr = 255;_gr++;

*pixel_gr = 255;_gr++;

*pixel_gr = 255;

}

{

*pixel_gr = 0;_gr++;

*pixel_gr = 0;_gr++;

*pixel_gr = 0;

}

}

}.UnlockBits(bitmap_data);.BackgroundImage = picture;

}

}int CorrectColor(int C)

{(C >255)

{255;

}if (C <0)

{0;

}C;

}void аддитивныйToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, x, y, n;r, g, b;rand = new Random();.Value = 1;.Step = 1;= rand.Next(picture.Width * 30, picture.Width * 32);.Maximum = n;= 0;(i < n)

{= rand.Next(0, picture.Width);= rand.Next(0, picture.Height);= picture.GetPixel(x, y).R + rand.Next(-40, 40);= picture.GetPixel(x, y).G + rand.Next(-40, 40);= picture.GetPixel(x, y).B + rand.Next(-40, 40);= CorrectColor(r);= CorrectColor(g);= CorrectColor(b);.SetPixel(x, y, Color.FromArgb(r, g, b));++;.PerformStep();

}.BackgroundImage = picture;.Refresh();

}void мультипликативныйToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, x, y, n;r, g, b;rand = new Random();.Value = 1;.Step = 1;= rand.Next(picture.Width * 30, picture.Width * 32);.Maximum = n;= 0;(i < n)

{= rand.Next(0, picture.Width);= rand.Next(0, picture.Height);= picture.GetPixel(x, y).R;= picture.GetPixel(x, y).G;= picture.GetPixel(x, y).B;= (int)(r * (rand.NextDouble() + 0.5));= (int)(g * (rand.NextDouble() + 0.5));= (int)(b * (rand.NextDouble() + 0.5));= CorrectColor(r);= CorrectColor(g);= CorrectColor(b);.SetPixel(x, y, Color.FromArgb(r, g, b));++;.PerformStep();

}.BackgroundImage = picture;.Refresh();

}void импульсныйToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, x, y, n;r, g, b;rand = new Random();.Value = 1;.Step = 1;= rand.Next(picture.Width * 30, picture.Width * 32);.Maximum = n;= 0;(i < n)

{= rand.Next(0, picture.Width);= rand.Next(0, picture.Height);= rand.Next(0, 256);= rand.Next(0, 256);= rand.Next(0, 256);.SetPixel(x, y, Color.FromArgb(r, g, b));++;.PerformStep();

}.BackgroundImage = picture;.Refresh();

}void ранговаяФильтрацияToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, j, k, m, count;[] R, G, B;minR, minG, minB, maxR, maxG, maxB;sR, sG, sB;= new int[8];= new int[8];= new int[8];.Value = 1;.Step = 1;.Maximum = picture.Width * picture.Height;

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

// 1 1 1

// 1 1 1

// 1 1 1(i = 1; i < (picture.Width - 1); i++)

{(j = 1; j < (picture.Height - 1); j++)

{= 0;

//Считываем уровни всех пикселей для красного в окне фильтра(k = -1; k <= 1; k++)

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

{(m == 0 && k == 0)

{;

}[count] = picture.GetPixel(i + k, j + m).R;[count] = picture.GetPixel(i + k, j + m).G;[count] = picture.GetPixel(i + k, j + m).B;++;

}

}.PerformStep();

//Находим минимум и максимум, используя стандартные методы C#= R.Min(); maxR = R.Max();= G.Min(); maxG = G.Max();= B.Min(); maxB = B.Max();

//Находим среднее значение между максимумом и минимумом= (maxR + minR) / 2;= (maxG + minG) / 2;= (maxB + minB) / 2;

//Помещаем средние значения на место центрального в окне фильтра.SetPixel(i, j, Color.FromArgb(sR, sG, sB));

}

}.BackgroundImage = picture;.Refresh();

}void trackBar1_MouseUp(object sender, MouseEventArgs e)

{bright = trackBar1.Value - 50;picture = new Bitmap(pictureBox1.BackgroundImage);r, g, b;(int i = 0; i < picture.Width - 1; i++)

{(int j = 0; j < picture.Height - 1; j++)

{= picture.GetPixel(i, j).R;= picture.GetPixel(i, j).G;= picture.GetPixel(i, j).B;+= bright;+= bright;+= bright;= CorrectColor(r);= CorrectColor(b);= CorrectColor(g);.SetPixel(i, j, Color.FromArgb(r, g, b));

}.BackgroundImage = picture;.Refresh();

}

}void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

}void trackBar2_MouseUp(object sender, MouseEventArgs e)

{K;= Convert.ToDouble(trackBar2.Value) / Convert.ToDouble(50);picture = new Bitmap(pictureBox1.BackgroundImage);AveR = 0, AveG = 0, AveB = 0;r, g, b;(int i = 0; i < picture.Width - 1; i++)

{(int j = 0; j < picture.Height - 1; j++)

{= AveR + picture.GetPixel(i, j).R;= AveG + picture.GetPixel(i, j).G;= AveB + picture.GetPixel(i, j).B;

}

}= AveR / (picture.Width * picture.Height);= AveG / (picture.Width * picture.Height);= AveB / (picture.Width * picture.Height);(int i = 0; i < picture.Width; i++)

{(int j = 0; j < picture.Height; j++)

{= picture.GetPixel(i, j).R;= picture.GetPixel(i, j).G;= picture.GetPixel(i, j).B;= (int)((r - AveR) * K) + AveR;= (int)((g - AveG) * K) + AveG;= (int)((b - AveB) * K) + AveB;= CorrectColor(r);= CorrectColor(g);= CorrectColor(b);.SetPixel(i, j, Color.FromArgb(r, g, b));

}.BackgroundImage = picture;.Refresh();

}

}void trackBar1_Scroll(object sender, EventArgs e)

{.Text = "Яркость" + "(" + Convert.ToString(trackBar1.Value - 50) + ")" + ":";.Refresh();

}void trackBar2_Scroll(object sender, EventArgs e)

{.Text = "Контраст" + "(" + Convert.ToString(Convert.ToDouble(trackBar2.Value) / Convert.ToDouble(50)) + ")" + ":";.Refresh();

}void медианныйФильтрToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, j, k, m, count;[] R, G, B;= new int[9];= new int[9];= new int[9];

//Матрица для этого фильтра будет иметь вид:

// 1 1 1

// 1 1 1

// 1 1 1.Value = 1;.Step = 1;.Maximum = picture.Width * picture.Height;(i = 1; i < (picture.Width - 1); i++)

{

//Вначаледвигаемсявправо(j = 1; j < (picture.Height - 1); j++)

{= 0;

//Считываем уровни всех пикселей для красного в окне фильтра(k = -1; k <= 1; k++)

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

{[count] = picture.GetPixel(i + k, j + m).R;[count] = picture.GetPixel(i + k, j + m).G;[count] = picture.GetPixel(i + k, j + m).B;++;

}

}.PerformStep();

//Сортируем полученные массивы, используя стандартные методы C#.Sort(R);.Sort(G);.Sort(B);

//Помещаем медианный элемент на место центрального в окне фильтра.SetPixel(i, j, Color.FromArgb(R[4], G[4], B[4]));

}

}.BackgroundImage = picture;.Refresh();

}SumMod8(int x, int y)

{summ =0;= x + y;(summ >7)

{= summ -8;

}summ;

}void методКиршаToolStripMenuItem_Click(object sender, EventArgs e)

{picture = new Bitmap(pictureBox1.BackgroundImage);i, j, g;[] S, T, A;=new double[8];=new double[8];=new double[8];max, mod;.Value = 1;.Step = 1;.Maximum = picture.Width * picture.Height;(i =1; i < (picture.Width -1); i++)

{(j =1; j < (picture.Height -1); j++)

{

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

// A0 A1 A2

// A7 F' A3

// A6 A5 A4[0] =0.3* picture.GetPixel(i -1, j -1).R +0.59* picture.GetPixel(i -1, j -1).G +0.11* picture.GetPixel(i -1, j -1).B;[1] =0.3* picture.GetPixel(i, j -1).R +0.59* picture.GetPixel(i, j -1).G +0.11* picture.GetPixel(i, j -1).B;[2] =0.3* picture.GetPixel(i +1, j -1).R +0.59* picture.GetPixel(i +1, j -1).G +0.11* picture.GetPixel(i +1, j -1).B;[3] =0.3* picture.GetPixel(i +1, j).R +0.59* picture.GetPixel(i +1, j).G +0.11* picture.GetPixel(i +1, j).B;[4] =0.3* picture.GetPixel(i +1, j +1).R +0.59* picture.GetPixel(i +1, j +1).G +0.11* picture.GetPixel(i +1, j +1).B;[5] =0.3* picture.GetPixel(i, j +1).R +0.59* picture.GetPixel(i, j +1).G +0.11* picture.GetPixel(i, j +1).B;[6] =0.3* picture.GetPixel(i -1, j +1).R +0.59* picture.GetPixel(i -1, j +1).G +0.11* picture.GetPixel(i -1, j +1).B;[7] =0.3* picture.GetPixel(i -1, j).R +0.59* picture.GetPixel(i -1, j).G +0.11* picture.GetPixel(i -1, j).B;(g =0; g <8; g++)

{

//Находим сумму Si[g] = A[g] +A[SumMod8(g, 1)] + A[SumMod8(g, 2)];

//Находимсумму Ti[g] = A[SumMod8(g, 3)] + A[SumMod8(g, 4)] + A[SumMod8(g, 5)] + A[SumMod8(g, 6)] + A[SumMod8(g, 7)];

}=0;(g =0; g <8; g++)

{

//Расчитываемзначение |5*Si-3*Ti|=Math.Abs((5* S[g]) - (3* T[g]));

//Находим максимум из полученных решений(mod > max)

{= mod;

}

}

//Для обеспечения более хорошей наблюдаемости повышаем полученное значение на 100= max +100;

//Выполняем коррекцию в пределах 0...255(max >255)

{=255;

}if (max <0)

{=0;

}.PerformStep();

//Помещаем результирующее значение в каждый из каналов R, G, B на место F'.SetPixel(i, j, Color.FromArgb((int)max, (int)max, (int)max));

}

}.BackgroundImage = picture;.Refresh();

}void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{(true);.Text = "Яркость:";.Text = "Контраст:";.Enabled = true;.Value = 50;.Enabled = true;.Value = 50;

}

}

}

Листинг класса DopForm.cs:System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;Microsoft.Office.Interop;Excel = Microsoft.Office.Interop.Excel;Kursach

{partial class DopForm : Form

{bitmap1, bitmap2, bitmap3, bitmap4;graphics1, graphics2, graphics3, graphics4;[] dop = new double[256];FLAG=0;name, filename;DopForm()

{();

}void refr1()

{.Image = bitmap1;

}void refr2()

{.Image = bitmap2;

}void refr3()

{.Image = bitmap3;

}void refr4()

{.Image = bitmap4;

}void DopForm_Load(object sender, EventArgs e)

{= new Bitmap(pictureBox1.Width, pictureBox1.Height);= Graphics.FromImage(bitmap1);= new Bitmap(pictureBox2.Width, pictureBox2.Height);= Graphics.FromImage(bitmap2);= new Bitmap(pictureBox3.Width, pictureBox3.Height);= Graphics.FromImage(bitmap3);= new Bitmap(pictureBox4.Width, pictureBox4.Height);= Graphics.FromImage(bitmap4);(); refr2(); refr3(); refr4();

}void Save_data(int opr)

{i, j;.Application oXL;.Workbook oWB;.Worksheet oSheet;.Minimum = 1;.Value = 1;.Step = 1;dv = new DataGridView();(opr == 1)= dataGridView1;if (opr == 2)= dataGridView2;if (opr == 3)= dataGridView3;= dataGridView4;.Maximum = dv.RowCount * dv.ColumnCount;

{= new Excel.Application();= (Excel.Workbook)oXL.Workbooks.Add(Type.Missing);

//oSheet = (Excel.Worksheet)oXL.Worksheets.Add(Type.Missing);= (Excel.Worksheet)oWB.ActiveSheet;(i = 0; i < dv.ColumnCount - 1; i++).Cells[1, i+1] = i;(i = 0; i < dv.RowCount - 1; i++)

{(j = 0; j < dv.ColumnCount - 1; j++)

{.Cells[i + 2, j+1] = dv.Rows[i].Cells[j].Value;.PerformStep();

}

}.Visible = true;.UserControl = true;

}(Exception theException)

{errorMessage;= "Error: ";= String.Concat(errorMessage, theException.Message);= String.Concat(errorMessage, " Line: ");= String.Concat(errorMessage, theException.Source);.Show(errorMessage, "Error");

}

}void закрытьToolStripMenuItem_Click(object sender, EventArgs e)

{();

}void сохранить1ToolStripMenuItem_Click(object sender, EventArgs e)

{_data(1);

}void сохранить2ToolStripMenuItem1_Click(object sender, EventArgs e)

{_data(2);

}void сохранить3ToolStripMenuItem1_Click(object sender, EventArgs e)

{_data(3);

}void сохранить4ToolStripMenuItem1_Click(object sender, EventArgs e)

{_data(4);

}void histogramm(int hist)

{i, j;zn, dl;dop_max;my;gr;bp;dg;(hist == 1)

{= graphics1;

//graphics1.Clear(Color.Transparent);

//graphics2.Clear(Color.Transparent);

//graphics3.Clear(Color.Transparent);

//graphics4.Clear(Color.Transparent);= bitmap1;= dataGridView1;

}if (hist == 2)

{= graphics2;

//graphics2.Clear(Color.Transparent);

//graphics1.Clear(Color.Transparent);= bitmap2;= dataGridView2;

}if (hist == 3)

{= graphics3;

//graphics3.Clear(Color.Transparent);= bitmap3;= dataGridView3;

}

{= graphics4;

//graphics4.Clear(Color.Transparent);= bitmap4;= dataGridView4;

}.DrawLine(new Pen(Color.Black), 5, 5, 5, bp.Height - 5);.DrawLine(new Pen(Color.Black), 0, bp.Height - 15, bp.Width - 5, bp.Height - 15);.DrawLine(new Pen(Color.Black), (bp.Width - 10) / 5 + 5, bp.Height - 17, (bp.Width - 10) / 5 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 2 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 2 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 3 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 3 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 4 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 4 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 5 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 5 + 5, bp.Height - 13);.DrawString("50", new Font("Arial", 8), new SolidBrush(Color.Red), (bp.Width - 10) / 5 - 5, bp.Height - 15);.DrawString("100", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 2 - 7, bp.Height - 15);.DrawString("150", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 3 - 5, bp.Height - 15);.DrawString("200", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 4 - 7, bp.Height - 15);.DrawString("255", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 5 - 5, bp.Height - 15);(i = 0; i < dg.RowCount - 1; i++)

{(j = 0; j < dg.ColumnCount - 2; j++)

{= (int)dg.Rows[i].Cells[j + 1].Value;[zn]++;

}

}_max = dop[0];(i = 1; i < 256; i++)(dop[i] > dop_max)_max = dop[i];= Convert.ToDouble(bp.Height - 20) / Convert.ToDouble(dop_max);(i = 0; i < 255; i++)

{= Convert.ToInt32(dop[i] * my);

//graphics1.DrawLine(new Pen(Color.Blue), 6 + i, bp.Height - 15, 6 + i, bp.Height - 15 - dl);.DrawLine(new Pen(Color.Blue), 6 + i, bp.Height - 15, 6 + i, bp.Height - 15 - dl);

}

}void построениеToolStripMenuItem_Click(object sender, EventArgs e)

{= 0;k;.SelectedIndex = 1;.Clear(Color.Transparent);.Clear(Color.Transparent);.Clear(Color.Transparent);.Clear(Color.Transparent);(label10.Text == "1")

{(1);();

}

{(k = 1; k < 5;k++ )(k);();();();();

}

}void ogibayushaya(int ogib)

{= 1;i, j, z;zn;my, dop_max;gr;bp;dg;(ogib == 1)

{= graphics1;.Clear(Color.Transparent);.Clear(Color.Transparent);.Clear(Color.Transparent);.Clear(Color.Transparent);= bitmap1;= dataGridView1;

}if (ogib == 2)

{= graphics2;.Clear(Color.Transparent);.Clear(Color.Transparent);= bitmap2;= dataGridView2;

}if (ogib == 3)

{= graphics3;.Clear(Color.Transparent);= bitmap3;= dataGridView3;

}

{= graphics4;.Clear(Color.Transparent);= bitmap4;= dataGridView4;

}.DrawLine(new Pen(Color.Black), 5, 5, 5, bp.Height - 5);.DrawLine(new Pen(Color.Black), 0, bp.Height - 15, bp.Width - 5, bp.Height - 15);.DrawLine(new Pen(Color.Black), (bp.Width - 10) / 5 + 5, bp.Height - 17, (bp.Width - 10) / 5 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 2 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 2 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 3 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 3 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 4 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 4 + 5, bp.Height - 13);.DrawLine(new Pen(Color.Black), ((bp.Width - 10) / 5) * 5 + 5, bp.Height - 17, ((bp.Width - 10) / 5) * 5 + 5, bp.Height - 13);.DrawString("50", new Font("Arial", 8), new SolidBrush(Color.Red), (bp.Width - 10) / 5 - 5, bp.Height - 15);.DrawString("100", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 2 - 7, bp.Height - 15);.DrawString("150", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 3 - 5, bp.Height - 15);.DrawString("200", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 4 - 7, bp.Height - 15);.DrawString("255", new Font("Arial", 8), new SolidBrush(Color.Red), ((bp.Width - 10) / 5) * 5 - 5, bp.Height - 15);(i = 0; i < dg.RowCount - 1; i++)

{(j = 0; j < dg.ColumnCount - 2; j++)

{= (int)dg.Rows[i].Cells[j + 1].Value;[zn]++;

}

}_max = dop[0];(i = 1; i < 256; i++)(dop[i] > dop_max)_max = dop[i];= Convert.ToDouble(bp.Height - 20) / dop_max;kol = 0;(i = 0; i < 256; i++)

{[i] = (dop[i] * my);(dop[i] != 0)++;

}[] x = new double[kol];[] y = new double[kol];= 0;(i = 0; i < 256; i++)

{(dop[i] != 0)

{[kol] = dop[i];[kol] = i;++;

}

}

//Interpolyatsiya[] L2 = new double[kol];[] D2 = new double[kol];[,] matr2 = new double[kol, kol];P, rez, rez1, N, N1;= x[0]; N1 = x[0]; rez1 = y[0];(N < x[kol-1] - 1)

{= N + 1;(i = 0; i < kol; i++)(N == x[i])= N + 0.5;= 1;(i = 0; i < kol; i++)(j = 0; j < kol; j++)

{(i == j)

{[i, j] = N - x[i];= P * matr2[i, j];

}[i, j] = x[i] - x[j];

}(i = 0; i < kol; i++)[i] = 1;(i = 0; i < kol; i++)(j = 0; j < kol; j++)[i] = D2[i] * matr2[i, j];(i = 0; i < kol; i++)[i] = P / D2[i];= 0;(i = 0; i < kol; i++)= rez + y[i] * L2[i];.DrawLine(new Pen(Color.Black), Convert.ToInt64(5 + N1), Convert.ToInt64(bp.Height - 15 - rez1), Convert.ToInt64(5 + N), Convert.ToInt64(bp.Height - 15 - rez));= N; rez1 = rez;

}

}void огибающаяToolStripMenuItem_Click(object sender, EventArgs e)

{k;.SelectedIndex = 1;(label10.Text == "1")

{(1);();

}

{(k = 2; k < 5; k++)(k);();();();

}

}void Save_Image(int img)

{gr;pb;(img == 1)

{= graphics1;= pictureBox1;

}if (img == 2)

{= graphics2;= pictureBox2;

}if (img == 3)

{= graphics3;= pictureBox3;

}

{= graphics4;= pictureBox4;

}= pb.CreateGraphics();savedialog = new SaveFileDialog();.Title = "Сохранить картинку как ...";.OverwritePrompt = true;.CheckPathExists = true;.Filter =.Filter = //"JPEG - Формат изображения|*.jpg";

"JPEG File(*.jpg)|*.jpg|" +

"Bitmap File(*.bmp)|*.bmp|" +

"GIF File(*.gif)|*.gif|" +

"TIF File(*.tif)|*.tif|" +

"PNG File(*.png)|*.png";.ShowHelp = true;r = pb.RectangleToScreen(pb.ClientRectangle);b = new Bitmap(r.Width, r.Height);g = Graphics.FromImage(b);.CopyFromScreen(r.Location, new Point(0, 0), r.Size);(savedialog.ShowDialog() == DialogResult.OK)

{

// Get the user-selected file namefileName = savedialog.FileName;

// Get the extensionstrFilExtn =.Remove(0, fileName.Length - 3);

// Save file.BackColor = System.Drawing.Color.Transparent;= strFilExtn;= fileName;

}(name)

{"bmp":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);;"jpg":.Save(filename);;"gif":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Gif);;"tif":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Tiff);;"png":.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Png);;:;

}

{= new System.Diagnostics.Process();.process1.StartInfo.Domain = "";.process1.StartInfo.LoadUserProfile = false;.process1.StartInfo.Password = null;.process1.StartInfo.StandardErrorEncoding = null;.process1.StartInfo.StandardOutputEncoding = null;.process1.StartInfo.UserName = "";.process1.SynchronizingObject = this;.StartInfo.FileName = filename;.EnableRaisingEvents = true;.Start();

}{ }

}void сохранить1ToolStripMenuItem_Click_1(object sender, EventArgs e)

{_Image(1);

}void сохранить2ToolStripMenuItem_Click(object sender, EventArgs e)

{_Image(2);

}void сохранить3ToolStripMenuItem_Click(object sender, EventArgs e)

{_Image(3);

}void сохранить4ToolStripMenuItem_Click(object sender, EventArgs e)

{_Image(4);

}void button1_Click(object sender, EventArgs e)

{

закрытьToolStripMenuItem_Click(sender, e);

}void pictureBox1_MouseMove(object sender, MouseEventArgs e)

{(FLAG == 0)

{((e.X > 4) && (e.X < 261))

{.Location = new Point(e.X, e.Y + 75);

//Доделать

//label11.Text = "(" + Convert.ToString(e.X - 6) + "; " + Convert.ToString(dop[e.X - 6]) + ")";

}

{.Location = new Point(485, 5);.Text = "(X; Y)";

}

}

{.Location = new Point(485, 5);.Text = "(X; Y)";

}

}

}

}


Реферат Пояснительная записка к курсовой работе: 23 страницы, 1 приложение, 12 рисунков. Цель работы - практическое закрепление теоретической части ку

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ