Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава

Учебное пособие по курсу "Компьютерная обработка изображений"


Повороты изображений

Для выполнения поворота изображения можно воспользоваться функцией 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.