русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Зеркальные отражения изображений


Дата добавления: 2014-02-04; просмотров: 1019; Нарушение авторских прав


Размещение изображения в памяти if(bmphdr) { // Создание структуры заголовка изображения m_img = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, bmphdr->biWidth, bmphdr->biHeight, NULL, NULL, NULL, NULL); // Преобразование прочитанного из файла изображения iplConvertFromDIB(bmphdr, m_img); // Обновление отображения UpdateAllViews(NULL); } else { TRACE0("Ошибка при чтении файла BMP"); } } }Изменение размеров изображения

Для изменения размеров изображения можно воспользоваться следующими функциями библиотеки IPL:

void iplZoom(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // растягивает или увеличивает изображение
void iplDecimate(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // сжимает или уменьшает изображение
void iplResize(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // изменяет размеры изображения
void iplDecimateBlur (IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate, int xMaskSize, int yMaskSize); // уменьшает и размывает изображение

Как видите, эти функции имеют почти одинаковые наборы аргументов, где:
IplImage* srcImage; // указатель на исходное изображение
IplImage* dstImage; // указатель на изображение, в котором функция должна сохранить результат

Положительные целочисленные аргументы xDst и xSrc определяют коэффициент масштабирования по x, который равен отношению xDst/xSrc, а yDst и ySrc – коэффициент масштабирования по y, равный отношению yDst/ySrc.

Для увеличения изображения в два раза в каждом направлении можно воспользоваться функцией iplZoom. Аргументы xDst, xSrc, yDst и ySrc при вызове этой функции должны иметь следующие значения: xDst=2, xSrc=1, yDst=2 и ySrc=1 (Рис. 1). В этой функции отношения xDst/xSrc и yDst/ySrc должны быть больше либо равны 1, иначе во время выполнения библиотека выдаст сообщение об ошибке (Рис. 2).



iplZoom

Рис. 1. Действие функции iplZoom с аргументами xDst=2, xSrc=1, yDst=2 и ySrc=1

Рис. 2. Сообщение об ошибке в функции iplZoom.

Для уменьшения изображения в два раза в каждом направлении можно воспользоваться функцией iplDecimate или функцией iplDecimateBlur. Аргументы xDst, xSrc, yDst и ySrc при вызове этой функции должны иметь следующие значения: xDst=1, xSrc=2, yDst=1 и ySrc=2 (Рис. 3). В этих функциях отношения xDst/xSrc и yDst/ySrc должны быть меньше либо равны 1, иначе во время выполнения библиотека выдаст сообщение об ошибке (Рис. 4).

iplDecimate

Рис. 3. Действие функции iplDecimate с аргументами xDst=1, xSrc=2, yDst=1 и ySrc=2

Рис. 4. Сообщение об ошибке в функции iplDecimate

Функция iplResize позволяет увеличивать изображение в одном направлении и уменьшать в другом. Например, для увеличения изображения в полтора раза в направлении x и одновременного уменьшения в полтора раза в направлении y аргументам: xDst, xSrc, yDst и ySrc необходимо присвоить следующие значения: xDst=3, xSrc=2, yDst=2 и ySrc=3 (Рис. 5). Таким образом, коэффициенты масштабирования по x и по y могут принимать любые значения, которые выражаются дробями xDst/xSrc и yDst/ySrc.

iplResize

Рис. 5. Действие функции iplResize с аргументами xDst=3, xSrc=2, yDst=2 и ySrc=3.

Последний целочисленный аргумент interpolate определяет метод интерполяции, который будет использоваться при вычислении неизвестных значений пикселов изображения в процессе изменения его размеров. Этот аргумент задаётся с помощью одной из трех констант:
IPL_INTER_NN; // определение неизвестных значений по ближайшему соседнему пикселу
IPL_INTER_LINEAR; // определение неизвестных значений с использованием линейной интерполяции
IPL_INTER_CUBIC; // определение неизвестных значений с использованием кубической интерполяции

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

iplZoom IPL_INTER_NN IPL_INTER_LINEAR IPL_INTER_CUBIC

Рис. 6. Действие функции iplZoom в различных режимах интерполирования

Функция iplDecimateBlur требует задания двух дополнительных целочисленных аргументов xMaskSize и yMaskSize, которые определяют размер маски размытия. На рисунке 7 для сравнения представлены результаты уменьшения изображения выполненные с использованием функций iplDecimate и iplDecimateBlur. Изображение, полученное с помощью функции iplDecimateBlur, – визуально более "гладкое", но заметна тёмная рамка, которая является результатом процедуры фильтрации.

iplDecimate
iplDecimateBlur

Рис. 7. Действие функции iplDecimate с аргументами xDst=1, xSrc=2, yDst=1 и ySrc=2

При выполнении изменений размеров изображения можно воспользоваться макроопределениями iplZoomFit, iplDecimateFit и iplResizeFit, предоставляемыми библиотекой IPL. Макроопределения при нимяют всего три аргумента: указатель на исходное изображение srcImage, указатель на изображение dstImage, в котором будет сохранен результат преобразований, и целочисленный аргумент interpolate, определяющий метод интерполирования. Коэффициенты масштабирования в этих макроопределениях вычисляются исходя из размеров изображений srcImage и dstImage.

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

Рис. 8. Сообщение об ошибке в функции не выполняющей преобразование по месту

Для организации выполнения преобразований по месту необходимо выполнить следующие действия:

  1. Создать временное изображение требуемого размера.
  2. Выполнить преобразование исходного изображения и записать результат во временное изображение.
  3. Удалить исходное изображение.
  4. Скопировать временное изображение на место исходного.
  5. Удалить временное изображение.

Для примера эти действия реализованы в функции ZoomImage, которая предназначена для пропорционального увеличения или уменьшения изображения и принимает два аргумента: указатель на преобразуемое изображение img и коэффициент масштабирования scale. Для преобразования изображений в функции ZoomImage используются макроопределения iplZoomFit и iplDecimateFit.

void ZoomImage(IplImage* img, double scale){// Создать временное изображения с измененным размером IplImage* tmp = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, img->width*scale, img->height*scale, NULL, NULL, NULL, NULL); // Занять память под временное изображение iplAllocateImage(tmp, 0, 0); if(scale > 1.) { // Выполнить увеличение изображения iplZoomFit(img, tmp, IPL_INTER_LINEAR); } else { // Выполнить уменьшение изображения iplDecimateFit(img, tmp, IPL_INTER_LINEAR); } // Освободить память исходного изображения iplDeallocate(img, IPL_IMAGE_ALL); // Скопировать результат в исходное изображение img=iplCloneImage(tmp); // Освободить память временного изображения iplDeallocate(tmp, IPL_IMAGE_ALL);}

 

Зеркальные отражения изображений в библиотеке IPL можно осуществить с использованием функции iplMirror, которая принимает три аргумента. При вызове функции iplMirror кроме указателей на исходное изображение srcImage и изображение-результат dstImage передается целочисленный аргумент flipAxis, который указывает, относительно какой оси будет осуществляться зеркальное отражение. Аргумент flipAxis может принимать следующие значения:

  • 0 – для отражения относительно горизонтальной оси;
  • 1 – для отражения относительно вертикальной оси;
  • -1 – для отражения сразу относительно вертикальной и горизонтальной оси.

Результаты применения функции iplMirror приведены на рисунке:

iplMirror flipAxis=0 flipAxis=1 flipAxis=-1

Рис. 1. Действие функции iplMirror

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

iplMirror(img, img, 0);


<== предыдущая лекция | следующая лекция ==>
Работа с файлами в формате BMP | Повороты изображений


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.287 сек.