Проектирование процесса преобразования черно-белых растровых изображений в цветные

Автор работы: Пользователь скрыл имя, 23 Мая 2013 в 19:32, курсовая работа

Описание работы

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

Содержание работы

ВВЕДЕНИЕ
1 Описание функционирования используемого процесса преобразования черно-белых растровых изображений в цветные
1.1 Функциональная модель используемого процесса преобразования
1.2 Анализ функционирования процесса преобразования
1.3 Проблемы и возможные методы решения данной задачи
2 Обзор существующих методов преобразования растровых изображений
2.1 Пороговая сегментация
2.2 Сегментация, основанная на областях
2.3 Сегментация на основании морфологического водораздела
2.4 Сегментация с использованием оператора Собеля
2.5 Выводы по обзору существующих методов преобразования растровых изображений.
3 Требования к проектируемой системе преобразования черно-белых растровых изображений в цветные
3.1 Требования к системе в целом
3.2 Требования к задачам, выполняемым системой
3.3 Требования к видам обеспечения
3.3.1 Требования к математическому обеспечению
3.3.2 Требования к информационному обеспечению
3.3.3 Требования к лингвистическому обеспечению
3.3.4 Требования к программному обеспечению
3.3.5 Требования к техническому обеспечению
3.3.6 Требования к организационному обеспечению
4 Архитектура системы преобразования черно-белых растровых изображений в цветные
5 Математическое обеспечение системы преобразования черно-белых растровых изображений в цветные
5.1 Описание алгоритма преобразования черно-белых растровых изображений в цветные с использованием оператора Собеля и последующей заливкой
5.2 Математическая модель алгоритма преобразования черно-белых растровых изображений в цветные с использованием оператора Собеля и последующей заливкой
6 Информационное обеспечение системы преобразования черно-белых растровых изображений в цветные
7 Тестирование программы преобразования черно-белых растровых изображений в цветные
8 Описание функционирования системы преобразования черно-белых растровых изображений в цветные
8.1 Роли пользователей
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А: Исходный текст программы
ПРИЛОЖЕНИЕ Б: Руководство пользователя

Файлы: 1 файл

kursach_MiMIUS.docx

— 1.31 Мб (Скачать файл)

Рисунок 7.1 – Первичная обработка изображения

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

Рисунок 7.2 – Результирующее изображение после обработки

8 Описание функционирования  системы преобразования черно-белых  растровых изображений в цветные

 

Любая система описывается  после окончания разработки. Описание системы необходимы в основном необходимо для заказчиков программного обеспечения  для понимания взаимодействия с  системой.

8.1 Роли пользователей

Так как процесс преобразования черно-белых растровых изображений  полностью не автоматизирован, от пользователя требуются некоторые способности, такие как:

- Умение пользоваться  персональным компьютером на  уровне «пользователя»

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

- Аккуратность при заливке  изображений, так как программе  не предусмотрен откат к предыдущим  действиям

На рисунке 8.1 представлена диаграмма UML, диаграмма, показывающая взаимодействие пользователя и системы.

Рисунок 8.2 – Диаграмма  UML

 

 

 

ЗАКЛЮЧЕНИЕ

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

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1 Википедия. Свободная энциклопедия. URL: http://ru.wikipedia.org/wiki/Сегментация_(обработка_изображений)

2 Гонсалес и др. 2006 –  Гонсалес, Р. Цифровая обработка  изображений / Р. Гонсалес, Р. Вудс – М. : Техносфера, 2006. – 1072 с.

3 Прэтт У. Цифровая обработка изображений т.1, т.2.

4 Телегина М.В., Мурынов А.И. Структурно-цветовой анализ графических изображений на основе динамической экстентной модели кластера //Известия института математики и информатики. Ижевск. 2006. № 2. С. 197-200.

5 Галичанин А.А., Мурынов А.И., Лялин В.Е., Левицкая Л.Н., Телегина М.В. Адаптивное цветотоновое преобразование графических изображений //«Математическое моделирование и интеллектуальные системы», Сборник трудов ИжГТУ, Ижевск, 2003, №2. с. 25 –38. 

ПРИЛОЖЕНИЕ А: ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ

int progress;

DateTime dt;

Bitmap^ fillBitmap;

Bitmap^ binary;

Drawing::Size ^ size;

private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e)

{

pictureBox1->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox1->Size.Height);

pictureBox2->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox2->Size.Height);

pictureBox3->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox3->Size.Height);

pictureBox2->Location = System::Drawing::Point(pictureBox1->Location.X + pictureBox1->Size.Width + 10, 27);

pictureBox3->Location = System::Drawing::Point(pictureBox2->Location.X + pictureBox2->Size.Width + 10, 27);

}

private: System::Void открытьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)

{

openFileDialog1->ShowDialog(); 

 dt = DateTime::Now;

 progress = 0;

progressBar1->Value = 0;

Bitmap^ bitmap = gcnew Bitmap(openFileDialog1->FileName);

progressBar1->Maximum = (bitmap->Width*2)-3;

pictureBox1->Image = Bitmap::FromFile(openFileDialog1->FileName);

 GrayScale(bitmap);

 int rift = 128*128;

 if(textBox1->Text != "")

{

 rift = Convert::ToInt32(textBox1->Text);

}

 segm(gcnew Bitmap(pictureBox2->Image), gcnew Bitmap(pictureBox1->Image), rift);

}

 

 void GrayScale(Bitmap^ image)

{

Color^ color;

Color grayScale;

 for(int x = 0; x < image->Width; x++)

{

 for(int y = 0; y < image->Height; y++)

{

 color = image->GetPixel(x, y);

 int mid = (color->R + color->G + color->B) / 3;

 grayScale = Color::FromArgb(255, mid, mid, mid);

 image->SetPixel(x, y, grayScale);

}

 status();

}

pictureBox2->Image = image;

}

 

void segm(Bitmap^ bitmap, Bitmap^ bitmap1, int rift)

{

Color color;

Bitmap^ bm = gcnew Bitmap(bitmap->Width, bitmap->Height);

binary = gcnew Bitmap(bitmap->Width, bitmap->Height);

int segment = 0;

int gx[3][3] = { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };

int gy[3][3] = { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };

for(int x = 1; x < bitmap->Width-2; x++)

{

for(int y = 1; y < bitmap->Height-2; y++)

{

color = bitmap1->GetPixel(x, y);

float new_x = 0, new_y = 0;

for (int hw = 0; hw < 3; hw++)

{

for (int wi = 0; wi < 3; wi++)

{

int _i = y + hw - 1;

int _j = x + wi - 1;

int curr = bitmap->GetPixel(_j, _i).B;

new_x += gx[hw][wi] * curr;

new_y += gy[hw][wi] * curr;

}

}

if (new_x * new_x + new_y * new_y > rift)

{

bm->SetPixel(x, y, Color::Black);

binary->SetPixel(x, y, Color::Black);

}

else

{

binary->SetPixel(x, y, Color::White);

bm->SetPixel(x, y, color);

}

}

status();

}

label1->Text = "Создано сегментов: " + Convert::ToString(segment);

pictureBox3->Image = bm;

}

 

void FloodFill(Bitmap ^bitmap, int x, int y, Color color)

{

BitmapData ^data = bitmap->LockBits(Rectangle(0, 0, bitmap->Width, bitmap->Height), ImageLockMode::ReadWrite, PixelFormat::Format32bppArgb);

array<int> ^bits = gcnew array<int>(data->Stride / 4 * data->Height);

Marshal::Copy(data->Scan0, bits, 0, bits->Length);

LinkedList<Point> ^check = gcnew LinkedList<Point>();

int floodTo = color.ToArgb();

int floodFrom = bits[x + y * data->Stride / 4];

bits[x + y * data->Stride / 4] = floodTo;

if (floodFrom != floodTo)

{

check->AddLast(Point(x, y));

while (check->Count > 0)

{

Point cur = check->First->Value;

check->RemoveFirst();

for each (Point off in gcnew array<Point> { Point(0, -1), Point(0, 1), Point(-1, 0), Point(1, 0)})

{

Point next = Point(cur.X + off.X, cur.Y + off.Y);

if (next.X >= 0 && next.Y >= 0 && next.X < data->Width && next.Y < data->Height)

{

if (bits[next.X + next.Y * data->Stride / 4] == floodFrom)

{

check->AddLast(next);

bits[next.X + next.Y * data->Stride / 4] = floodTo;

}

}

}

}

}

Marshal::Copy(bits, 0, data->Scan0, bits->Length);

bitmap->UnlockBits(data);

}

 

void status()

{

progress++;

String^ dtRez = Convert::ToString(DateTime::Now - dt);

dtRez = dtRez->Substring(6,6);

label2->Text = "Затрачено времени: " + dtRez + " сек.";

progressBar1->Value = progress;

}

 

private: System::Void MyForm_Resize(System::Object^  sender, System::EventArgs^  e)

{

pictureBox1->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox1->Size.Height);

pictureBox2->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox2->Size.Height);

pictureBox3->Size = Drawing::Size((this->Size.Width/3)-20, pictureBox3->Size.Height);

pictureBox2->Location = System::Drawing::Point(pictureBox1->Location.X + pictureBox1->Size.Width + 10, 27);

pictureBox3->Location = System::Drawing::Point(pictureBox2->Location.X + pictureBox2->Size.Width + 10, 27);

}

 

private: System::Void pictureBox3_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)

{

 size = Drawing::Size(e->X, e->Y);

if(e->Button == System::Windows::Forms::MouseButtons::Left)

{

 if(pictureBox3->AutoSize == true)

{

 fillBitmap = gcnew Bitmap(pictureBox3->Image);

 int x = e->X;

 int y = e->Y;

 FloodFill(binary, x, y, fillBitmap->GetPixel(x, y));

 for(int i = 0; i < binary->Width; i++)

{

 for(int j = 0; j < binary->Height; j++)

{

Color color = binary->GetPixel(i, j);

Color color1 = fillBitmap->GetPixel(i, j);

 if(color == Color::FromArgb(255, 255, 255, 255))

{

 fillBitmap->SetPixel(i, j, color1);

}

 else

{

 fillBitmap->SetPixel(i, j, color);

}

}

}

pictureBox3->Image = fillBitmap;

}

}

}

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)

{

 if(pictureBox3->AutoSize == false)

{

pictureBox3->AutoSize = true;

button1->Text = "-";

pictureBox3->Size = Drawing::Size(pictureBox3->Image->Width, pictureBox3->Image->Height);

}

 else

{

pictureBox3->AutoSize = false;

button1->Text = "+";

pictureBox3->Size = pictureBox2->Size;

pictureBox3->Location = System::Drawing::Point(pictureBox2->Location.X + pictureBox2->Size.Width + 10, 27);

}

}

private: System::Void textBox1_PreviewKeyDown(System::Object^  sender, System::Windows::Forms::PreviewKeyDownEventArgs^  e)

{

 if(e->KeyCode == Keys::Enter)

{

 progress = 0;

 dt = DateTime::Now;

progressBar1->Maximum = pictureBox2->Image->Width-3;

 segm(gcnew Bitmap(pictureBox2->Image), gcnew Bitmap(pictureBox1->Image), Convert::ToInt32(textBox1->Text));

}

}

private: System::Void pictureBox3_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)

{

if(e->Button == System::Windows::Forms::MouseButtons::Right)

{

 if(pictureBox3->AutoSize == true)

{

 fillBitmap = gcnew Bitmap(pictureBox3->Image);

 int x = e->X;

 int y = e->Y;

colorDialog1->Color = fillBitmap->GetPixel(x, y);

colorDialog1->FullOpen = true;

colorDialog1->ShowDialog();

 FloodFill(binary, x, y, colorDialog1->Color);

 for(int i = 0; i < binary->Width; i++)

{

 for(int j = 0; j < binary->Height; j++)

{

Color color = binary->GetPixel(i, j);

Color color1 = fillBitmap->GetPixel(i, j);

 if(color == Color::FromArgb(255, 255, 255, 255))

{

 fillBitmap->SetPixel(i, j, color1);

}

 else

{

 fillBitmap->SetPixel(i, j, color);

}

}

}

pictureBox3->Image = fillBitmap;

}

}

if(e->Button == System::Windows::Forms::MouseButtons::Left)

{

 if(pictureBox3->AutoSize == true)

{

 fillBitmap = gcnew Bitmap(pictureBox3->Image);

 int x = e->X;

 int y = e->Y;

 FloodFill(binary, x, y, fillBitmap->GetPixel(size->Width, size->Height));

 for(int i = 0; i < binary->Width; i++)

{

 for(int j = 0; j < binary->Height; j++)

{

Color color = binary->GetPixel(i, j);

Color color1 = fillBitmap->GetPixel(i, j);

 if(color == Color::FromArgb(255, 255, 255, 255))

{

 fillBitmap->SetPixel(i, j, color1);

}

 else

{

 fillBitmap->SetPixel(i, j, color);

}

}

}

pictureBox3->Image = fillBitmap;

}

}

}

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)

{

 progress = 0;

 dt = DateTime::Now;

progressBar1->Maximum = pictureBox2->Image->Width-3;

 int rift = 128*128;

 if(textBox1->Text != "")

{

 rift = Convert::ToInt32(textBox1->Text);

}

 segm(gcnew Bitmap(pictureBox2->Image), gcnew Bitmap(pictureBox1->Image), rift);

}

private: System::Void экспортToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)

{

saveFileDialog1->ShowDialog();

 fillBitmap->Save(saveFileDialog1->FileName);

 }

};}

ПРИЛОЖЕНИЕ Б: РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

 

Общие сведения


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

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

Работа с программой


При первом запуске приложение вы увидите пустое окно. Для загрузки изображения в  программу нажмите Файл->Импорт и выберите рисунок, как это изображено на рис. 1.

Рисунок 1 - Выбор изображения

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

Рисунок 2 - Настройка порога сегментации

Результат после изменения порога сегментации  можно увидеть на рис. 3. Здесь  видно что все контуры закрыты.

Рисунок 3 - Результат настройки порога сегментации

Для изменения  цвета выделенных объектов нажмите  на знак "+" в верхнем правом углу. Изображение изменит свои размеры. Это показано на рис. 4. Наведите курсор мыши на выделенный объект и правой кнопкой выберите необходимый цвет. Так же можно выбрать цвет из самого рисунка, просто кликнув левой кнопкой  мыши на нужном цвете и перетащив  его куда необходимо.

Рисунок 4 - Выбор цвета для закраски

Результат закраски выделенного объекта показан  на рис.5.

Рисунок 5 - Закрашенный объект

Если  захотите отредактированное изображение  сохранить на диске, нажмите Файл->Экспорт и введите название для нового файла. Как это сделать показано на рис. 6.

Рисунок 6 - Сохранение изображения на диске

Требования и установка ПО


Для начала работы с программой необходимо:

1) Загрузить  программное обеспечение "My Form"

2) Убедиться  в наличиии на персональном компьютере операционной системе семейства Windows NT, Желательно классом не ниже Windows XP, лучше Windows 7 или Windows 8.

3) Убедиться  в наличии на персональном  компьютере программного обеспечения  Windows.NET не ниже 2.0.

4) Наличие  изображений для тестирования  программы.

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

 

 


Информация о работе Проектирование процесса преобразования черно-белых растровых изображений в цветные