Файл: Цифровая обработка изображений.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.11.2023

Просмотров: 19

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное бюджетное образовательное

учреждение высшего образования

«Казанский национальный исследовательский технический

университет им. А.Н. Туполева-КАИ»

(КНИТУ-КАИ)

Институт компьютерных технологий и защиты информации

Кафедра Автоматизированные системы обработки информации и управления «Сomputer-центр»

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

по дисциплине: «Цифровая обработка изображений»

Выполнила:студент гр.4383

Тимергалиев И.Ф.

Проверил:

Казань 2022

Задание


  1. Изучить основы программирования на языке C++ с использованием библиотеки OpenCV.

  2. Разработать программу рисования треугольников с сохранением результата в файле.

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

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


Выполнение работы


1. Разработать программу рисования треугольников с сохранением результата в файле.

Код программы:

#include

#include

#include
using namespace cv;

void my_mouse_callback(int event, int x, int y, int flags, void* param);
Point p;

int main(int argc, char* argv[])

{

//создание холста

Mat image = Mat(Size(400, 400), CV_8UC3, Scalar(0, 0, 0));
//создание окна

namedWindow("triangle");

setMouseCallback("triangle", my_mouse_callback, (void*)&image);

imshow("triangle", image);
while (true)

{

//Задержка

int key = waitKey(30);

if (key == 27)

break;

}
destroyWindow("triangle");

return 0;

}
//Рисование линий для треугольника

void draw_triangle(Mat* image, Point p)

{

line(*image,

Point(p.x, p.y),

Point(p.x + 100, p.y),

Scalar(255, 255, 255));
line(*image,

Point(p.x, p.y),

Point(p.x, p.y + 50),

Scalar(255, 255, 255));
line(*image,

Point(p.x, p.y + 50),

Point(p.x + 100, p.y),

Scalar(255, 255, 255));

}
//обработка нажатий

void my_mouse_callback(int event, int x, int y, int flags, void* param)

{

Mat* pimg = (Mat*)param;

switch (event)

{

case CV_EVENT_LBUTTONDOWN:

p.x = x;

p.y = y;
draw_triangle(pimg, p);

imshow("triangle", *pimg);

break;
case CV_EVENT_RBUTTONDOWN:

imwrite("triangle_image.png", *pimg);

break;

}

}



Рис 1. Программа, рисующая треугольники



Рис.2. Сохраненное изображение треугольников

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

Код программы:

#include

#include
using namespace std;

using namespace cv;
void my_mouse_callback(int event, int x, int y, int flags, void* param);
bool down = false;

bool up = false;

Mat img;

Rect box;

Point pt1, pt2;
int main(int argc, char* argv[])

{

img = imread("image.png");

namedWindow("img");

imshow("img", img);

setMouseCallback("img", my_mouse_callback);
while (1)

{

int key = waitKey(30);

if (key == 27)

break;

}

return 0;

}

void my_mouse_callback(int event, int x, int y, int, void*)

{

//Берет начальные точки

if (event == EVENT_LBUTTONDOWN)

{

down = true;

pt1.x = x;

pt1.y = y;

}

if (event == EVENT_LBUTTONUP)

{

//Берет конечные точки

if (abs(x - pt1.x) > 20 && abs(y - pt1.y) > 20)

{

up = true;

pt2.x = x;

pt2.y = y;

}

else { down = false; }

}

//Рисует динамически, до отпускания ЛКМ

if (down == true && up == false)

{

Point pt;

pt.x = x;

pt.y = y;
Mat rect = img.clone();
rectangle(rect, pt1, pt, Scalar(0x00, 0x00, 0xff));

imshow("img", rect);

}

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

if (down == true && up == true)

{

box.width = abs(pt1.x - pt2.x);

box.height = abs(pt1.y - pt2.y);
box.x = min(pt1.x, pt2.x);

box.y = min(pt1.y, pt2.y);
//Умеет копировать часть из введенного холста

Mat copyImg(img, box);

namedWindow("Cropped Image");

imshow("Cropped Image", copyImg);

imwrite("crop.png", copyImg);

down = false;

up = false;

}

}



Рис. 3 Исходное изображение



Рис. 4 Обрезанное изображение

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

Код программы:

#include

#include
using namespace cv;
void my_mouse_callback(int event, int x, int y, int flags, void* param);
Mat image;

Rect box = Rect(-1, -1, 0, 0);

Rect box2 = Rect(-1, -1, 0, 0);

int currentBox = 1;

bool drawingBox = false;
//Рисование прямоуольников

void draw_box(Mat* pimg, Rect rect)

{

rectangle(

*pimg,

Point(rect.x, rect.y),

Point(rect.x + rect.width, rect.y + rect.height),

Scalar(0, 0, 255));

}
int main(int argc, char* argv[])

{

image = imread("image.png");
Mat temp = image.clone();

namedWindow("Image", WINDOW_AUTOSIZE);

setMouseCallback("Image", my_mouse_callback, (void*)&image);
imshow("Image", temp);
while (1)

{

int key = cvWaitKey(30);

if (key == 27)

{

break;

}

image.copyTo(temp);

draw_box(&temp, box);

draw_box(&temp, box2);

imshow("Image", temp);

}

destroyWindow("Image");

return 0;

}
//Соединение изображений

void compoundBoxes()

{

int width = box.width + box2.width;

int height = max(box.height, box2.height);
Size size = Size(width, height);

Mat temp = Mat(size, CV_8UC3, Scalar(0xff, 0xff, 0xff));
//Заполнение попиксельно изображений

for (int valy = 0; valy < image.rows; valy++)

for (int valx = 0; valx < image.cols; valx++)

{

Vec3b val = image.at(valy, valx);
if (valx >= box.x && valx < box.x + box.width &&

valy >= box.y && valy < box.y + box.height)

temp.at(valy - box.y, valx - box.x) = val;
if (valx >= box2.x && valx < box2.x + box2.width &&

valy >= box2.y && valy < box2.y + box2.height)

temp.at(valy - box2.y, box.width + valx - box2.x) = val;

}
box = Rect(-1, -1, 0, 0);

box2 = Rect(-1, -1, 0, 0);
namedWindow("Cropped Image");

imshow("Cropped Image", temp);

imwrite("crop.png", temp);

}
void my_mouse_callback(int event, int x, int y,

int flags, void* param)

{

Mat* pimg = (Mat*)param;

switch (event)

{

case CV_EVENT_MOUSEMOVE:

if (drawingBox)

{

if (currentBox == 1)

{

box.width = x - box.x;

box.height = y - box.y;

}

else if (currentBox == 2)

{

box2.width = x - box2.x;

box2.height = y - box2.y;

}

}

break;
//Начало создания разметки

case CV_EVENT_LBUTTONDOWN:

drawingBox = true;
if (currentBox == 1)

box = Rect(x, y, 0, 0);

else if (currentBox == 2)

box2 = Rect(x, y, 0, 0);
break;
//Конец создания разметки

case CV_EVENT_LBUTTONUP:

drawingBox = false;

if (box.width < 0)

{

box.x += box.width;

box.width *= -1;

}

if (box.height < 0)

{

box.y += box.height;

box.height *= -1;

}

if (box2.width < 0)

{

box2.x += box2.width;

box2.width *= -1;

}

if (box2.height < 0)

{

box2.y += box2.height;

box2.height *= -1;

}
if (currentBox == 1)

currentBox = 2;

else

{

currentBox = 1;

compoundBoxes();

}
break;

}

}



Рис. 5 Исходное изображение



Рис. 6 Объединенные части изображения