- •Литература
- •Введение
- •Введение в Image Processing Library
- •Основные понятия теории сигналов
- •Переход от непрерывных сигналов и преобразований к дискретным
- •Преобразование Фурье
- •Быстрое преобразование Фурье
- •Ввод изображений
- •Кодирование цветных изображений
- •Глубина и квантование цвета
- •Сжатие изображений
- •Форматы графических файлов
- •Работа с файлами в формате bmp
- •Зеркальные отражения изображений
- •Повороты изображений
- •Препарирование изображений
- •Бинаризация
- •Яркостный срез
- •Линейное контрастирование
- •Пилообразное контрастирование
- •Соляризация
- •Эквализация
- •Выполнение логических и арифметических операций над изображенями
- •Выполнение логических операций
- •Выполнение арифметических операций
- •Общие понятия фильтрации изображений
- •Масочная фильтрация
- •Генерация шума
- •Восстановления изображений на основе обратной фильтрации
- •Фильтрация Винера
- •Итерационные методы восстановления изображений
- •Алгебраические методы восстановления изображений
Зеркальные отражения изображений
Зеркальные отражения изображений в библиотеке 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);
Повороты изображений
Для выполнения поворота изображения можно воспользоваться функцией iplRotate библиотеки IPL, которая имеет следующий прототип:
void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate);
Как обычно, первые два аргумента этой функции являются указателями на изображения: IplImage* srcImage; // указатель на исходное изображение IplImage* dstImage; // указатель на изображение, в котором функция должна сохранить результат
Третий вещественный аргумент angle определяет угол поворота изображения в градусах. Положительное значение аргумента angle соответствует повороту по часовой стрелке, а отрицательное – против часовой стрелки. Поворот изображения осуществляется вокруг угла изображения с координатами (0,0). Результаты поворота изображения на 45 градусов по часовой и против часовой стрелки представлены на рисунке 1.
|
iplRotate |
angle=45 |
angle=-45 |
Рис. 1. Действие функции iplRotate
Вещественные аргументы xShift и yShift определяют величины сдвига вдоль осей x и y после выполнения поворота. Результат поворота с последующим сдвигом представлен на рисунке 2.
|
iplRotate |
|
Рис. 2. Действие функции iplRotate с аргументами angle=45, xShift=srcImage->width/2 и yShift=srcImage->height/2
Если поворот изображения должен быть осуществлен вокруг точки с произвольными координатами (x, y), а не вокруг точки (0,0), то необходимо сначала вычислить величины сдвига, а затем вызвать функцию iplRotate. Величину сдвигов можно вычислить с помощью специальной функции iplGetRotateShift, которая имеет следующий прототип:
void iplGetRotateShift(double xCenter, double yCenter, double angle, double* xShift, double* yShift);
где xCenter и yCenter координаты точки, вокруг которой осуществляется поворот, angle – угол поворота, а xShift и yShift – указатели на переменные, которым должны быть присвоены значения вычисленных необходимых сдвигов.
Для поворота изображения вокруг точки с произвольными координатами гораздо удобнее воспользоваться макроопределением iplRotateCenter, которое имеет следующий прототип:
void iplRotateCenter(IplImage* srcImage, IplImage* dstImage, double angle, double xCenter, double yCenter, int interpolate);
где xCenter и yCenter – координаты точки, вокруг которой будет осуществляться вращение. Результат поворота изображения вокруг его центра представлен на рисунке:
|
iplRotateCenter |
|
Рис. 3. Действие макроопределения iplRotateCenter с аргументами angle=45, xCenter=srcImage->width/2 и yCenter=srcImage->height/2
Последний целочисленный аргумент interpolate функции iplRotate и макроопределения iplRotateCenter так же как и в функциях изменения размеров изображений определяет режим интерполирования. Перечисленные выше значения этого аргумента в функциях поворота могут комбинироваться в режиме побитового ИЛИ (|) комбинироваться с константой IPL_SMOOTH_EDGE, в результате чего края повернутого изображения будут сглаживаться.
Поворот прямоугольного изображения, выполняемый по месту, требует изменения его размеров. В приведенном примере функция RotateImageCW осуществляет поворот изображения по часовой стрелке на 90° (Рис. 4).
void RotateImageCW(IplImage* img)
{
// Создать временное изображение с измененным размером
IplImage* tmp = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR",
IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, img->height, img->width,
NULL, NULL, NULL, NULL);
// Занять память под временное изображение
iplAllocateImage(tmp, 0, 0);
// Выполнить поворот с последующим сдвигом
iplRotate(img, tmp, 90, 0, img->width-1, IPL_INTER_LINEAR);
// Освободить память исходного изображения
iplDeallocate(img, IPL_IMAGE_ALL);
// Скопировать результат в исходное изображение
img = iplCloneImage(tmp);
// Освободить память временного изображения
iplDeallocate(tmp, IPL_IMAGE_ALL);
}
|
RotateImageCW |
|
Рис. 4. Действие функции RotateImageCW
Функция для поворота на 90° против часовой стрелки RotateImageCСW может быть реализована аналогично. Аргументы angle, xShift и yShift должны иметь следующие значения: angle=-90, xShift=img->height-1 и yShift=0.