Вернуться наверх
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.