48629 (Разработка программного обеспечения для фильтрации растровых изображений), страница 2

2016-07-29СтудИзба

Описание файла

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

Онлайн просмотр документа "48629"

Текст 2 страницы из документа "48629"

Дополнительные возможности этой разновидности формата проявляются, если указать значение поля biCompression, равное 3. В этом случае вслед за структурой BITMAPINFOHEADER (на месте палитры цвета) следуют три поля DWORD: RedMask, GreenMask, BlueMask, которые задают битовые маски для компонентов цвета пиксела. Биты в этих масках обязательно должны быть смежными и не содержать перекрывающихся полей.

Для 16-битовых растровых данных часто применяют формат RGВ565, который задается следующей маской.

RedMask = 0хF8000000; // 1111 1000 0000 0000 0000 0000 0000 0000

GгееnМаsk = 0х07Е00000; // 0000 0111 1110 0000 0000 0000 0000 0000

В1uеМаsk = 0х001F0000; // 0000 0000 0001 1111 0000 0000 0000 0000

С помощью этой маски из значения WORD, задающего цвет пиксела, извлекается значение каждого цветового компонента. В формате RGВ565 красному и синему цветам отводится по 5 битов, а зеленому - 6 битов. Такое неравноправие обосновывают тем, что человеческий глаз более восприимчив к зеленому цвету, поэтому тщательная запись его градаций позволяет повысить качество изображения.

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

RedMask = 0ХFFC00000; // 1111 1111 1100 0000 0000 0000 0000 0000

GгееnМаsk = 0х00ЗFF000; // 0000 0000 0011 1111 1111 0000 0000 0000

В1uеМаsk = 0х00000FFС; // 0000 0000 0000 0000 0000 1111 1111 1100

По сравнению с форматом RGВ888 такое представление позволяет описать большее количество цветов.

2.4 Преобразования графических файлов

Рассмотрим два вида преобразований:

- точечные - новое значение элемента изображения (пиксела) рассчитывается только на основе его старого значения;

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

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

Рассмотрим, например, как можно инвертировать цвет картинки. Диапазон значений каждого 8-битного компонента цвета находится в пределах от 0 до 255. Создадим таблицу преобразования из 256 элементов и заполним ее значениями от 255 до 0 (рис. 2.4.1).

индекс

0

1

2

3

253

254

255

значение

255

254

253

252

2

1

0

Рисунок 2.4.1 - Таблица преобразования "инверсия"

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

Пространственное преобразование заключается в нахождении свертки значений группы пикселов. Свертка вычисляется как сумма пиксельных значений, попавших в зону преобразования, помноженных на весовые коэффициенты. В качестве весовых коэффициентов выступают элементы матрицы преобразования. Значения элементов матрицы преобразования и определяют тип преобразования. Размер матрицы преобразования соответствует области пикселов, которые будут участвовать в преобразовании. Центральный элемент матрицы - весовой коэффициент преобразуемого пиксела (х, у). Поэтому матрицы преобразования, обычно имеют нечетный размер (например, 3x3 или 5x5 элементов). Например, свертка с помощью единичной матрицы соответствует преобразованию "размытие" (понижение четкости) изображения. Достигается такой эффект за счет усреднения значений группы пикселов, охваченной матрицей преобразования. Если значение пиксела (х, у) было выше среднего, оно уменьшится, если было ниже среднего, то увеличится. Однако это не означает, что все изображение станет монотонным, так как матрица преобразования движется по изображению вместе с координатами (х, у), средний уровень тоже изменяется.

3. ПРОСМОТР И РЕДАКТИРОВАНИЕ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

3.1 Создание многодокументного приложения

С помощью генератора приложений АррWizard создаём каркас приложения для просмотра и редактирования рисунков.

- С помощью команды File/New/Projects/MFC AppWizard (exe) начнем создание приложения. Назовем проект ВМViewer.

- На первом шаге выберем тип приложения Multiple documents.

- Далее можно принять все установки по умолчанию.

3.2 Класс CRaster для работы с растровыми изображениями

Создаем в программе класс CRaster, отвечающий за загрузку и осуществляющий поддержку операций по обработке растрового изображения. Класс CRaster содержит два метода DrawBitmap, выполняющих вывод изображения на контекст устройства. Аргументы одного из методов позволяют задать положение и размеры выводимой области исходного изображения и определить область назначения. По умолчанию изображение выводится полностью в масштабе 1:1, однако с помощью аргументов этой функции можно и изменить масштаб. Второй метод позволяет просто указать позицию начала вывода и масштаб, в котором должно быть нарисовано изображение. Оба метода внутри используют мощную АРI-функцию StretchDIBits().

Режим масштабирования выбирается CDC-методом SetStretchBltMode():

int SetStretchBltMode(int nStretchMode);

Аргумент функции - nStretchMode - режим масштабирования. Поддерживаются следующие режимы масштабирования:

- BLACKONWHITE - выполняет булеву операцию AND между цветом существующих и удаленных пикселов (при уменьшении размера изображения). Этот режим используется, если масштабируется рисунок "черным по белому", т. е. алгоритм масштабирования будет стараться сохранить черные пикселы;

- COLORNCOLOR - этот режим удаляет (добавляет) строки (столбцы) пикселов без каких-либо попыток сохранить содержащуюся в них информацию. Наиболее быстрый режим. Используется, когда необходимо сохранить цвета изображения неизменными;

- WHITEONBLACK - выполняет булеву операцию OR. Этот режим используется, если масштабируется рисунок "белым по черному";

- HALFTONE - преобразует изображение к заданному размеру и при этом трансформирует цвета так, чтобы средний цвет полученной картинки приближался к исходному цвету. Наиболее медленный режим. Однако масштабированная картинка выглядит лучше за счет сглаживания "лестничного эффекта". Этот режим не работает в Windows 95/98, и, похоже, заменяется режимом COLORNCOLOR.

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

Чтобы можно было изменять масштаб вывода изображений, добавим в меню View программы команды Zoom In, Zoom Out, а для установки режима масштабирования – команды Stretch HALFTONE, Stretch COLORNCOLOR. Обработчики этих команд добавим в класс облика (листинг 3.2.1). Эти функции изменяют состояние переменных m_dScale и m_nStretchModeстановки режимов масштабирования также добавлены методы OnUpdateViewStretchhalftone() и OnUpdateViewStretchcoloroncolor() для обработки сообщения UPDATE_COMMAND_UI. В этих функциях можно управлять состоянием соответствующих команд в интерфейсе программы (например, можно делать недоступными команды в зависимости от состояния программы). В данном случае мы просто маркируем соответствующий режим масштабирования.

Листинг 3.2.1 – Обработка команд масштабирования. Файл BMView.cpp

void CBMView::OnViewZoomin()

{// TODO: Add your command handler code here

m_dScale*=2;

OnUpdate(NULL, 0, NULL); }

void CBMView::OnViewZoomout()

{// TODO: Add your command handler code here

m_dScale/=2;

OnUpdate(NULL, 0, NULL); }

void CBMView::OnViewStretchhalftone()

{// TODO: Add your command handler code here

m_nStretchMode=HALFTONE;

OnUpdate(NULL, 0, NULL); }

void CBMView::OnUpdateViewStretchhalftone(CCmdUI* pCmdUI)

{// TODO: Add your command update UI handler code here

pCmdUI->SetCheck(m_nStretchMode==HALFTONE); }

void CBMView::OnViewStretchcoloroncolor()

{// TODO: Add your command handler code here

m_nStretchMode=COLORONCOLOR;

OnUpdate(NULL, 0, NULL); }

void CBMView::OnUpdateViewStretchcoloroncolor(CCmdUI* pCmdUI)

{// TODO: Add your command update UI handler code here

pCmdUI->SetCheck(m_nStretchMode==COLORONCOLOR);}

3.3 Модификация класса документа для обеспечения работы с изображениями

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

Порядок работы с двумя объектами СRaster в этом случае будет выглядеть следующим образом:

- Загружаем изображение в первый объект СRaster и показываем его наэкране до тех пор, пока пользователь не даст команду выполнить какие-нибудь изменения изображения.

- Помещаем измененное изображение во второй объект СRaster и начинаем показывать второй объект-картинку.

- Может случиться так, что пользователю не понравится то, как мы изменили его картинку, тогда он отдает команду "Отменить преобразования".При этом меняются объекты местами.

3.4 Программная схема выполнения преобразований. Графические фильтры

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

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

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

Рисунок 3.6.1 - Схема использования фильтров для преобразования изображений

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

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

  1. Пришла команда выполнить преобразование - создаем рабочий поток.

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

  3. В рабочем потоке выполняется преобразование и увеличивается процент выполнения.

  4. По окончании преобразования (или если пользователь прервал выполнение) в объекты-облики посылаются сообщения о завершении работы ипоказывается преобразованная картинка.

Поскольку данными в программе ВМViewer заведует класс CBMDoc, именно в него и поместим "фильтрацию". Для создания рабочего потока потребуется добавить в класс CBMDoc несколько методов:

Transform() - создает рабочий поток;

ThreadProc () - функция потока, запускает "фильтрацию" для конкретного объекта-документа;

TransformLoop() - сама "фильтрация";

InformAllViews() - передает сообщения всем обликам документа; Рассмотрим метод TransformLoop() (Листинг 3.6.1).

Листинг 3.6.1 – Метод CBMDoc::TransformLoop(). Файл BMDoc.cpp

void CBMDoc::TransformLoop()

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5221
Авторов
на СтудИзбе
429
Средний доход
с одного платного файла
Обучение Подробнее