Как повернуть изображение на произвольную величину?

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

Number kPi = 3.14159265359

Image front := GetFrontImage()
ImageDisplay fDisp = front.ImageGetImageDisplay(0)
ROI line = fDisp.ImageDisplayGetRoi(0)
if ( line.RoiIsValid() )
{
    if ( line.RoiIsLine() )
    {
        number sx,sy,ex,ey
        line.RoiGetLine(sx,sy,ex,ey)
        number dy = ey - sy
        number dx = ex - sx
        number angle = atan( dy / dx ) * 180/kPi
        if ( dx < 0 ) 
            angle = angle + 180

        Result("\n Rotate image by " + angle + " degree.")
    }
}

person Community    schedule 14.11.2014    source источник


Ответы (1)


Хорошая идея для инструмента и хорошее кодирование до сих пор.

Команда, которую вы ищете, называется просто Rotate(). Возможно, вы пропустили его в справочной документации, потому что он (к сожалению) не указан в разделе «изображение». Существует специальный «справочный» раздел, предназначенный для обобщения «простых» скриптовых команд повседневного быстрого скриптинга:

введите здесь описание изображения

С помощью этой команды ваш скрипт может быть изменен на приведенный ниже. Обратите внимание, что я также заменил ваш kPi на команду PI(). Команда Rotate() требует, чтобы угол поворота был указан в радианах. Размер результирующего изображения будет увеличен, а изображение дополнено нулями. Кроме того: я заменил ваш оператор If сокращенной версией.

Image front := GetFrontImage()
ImageDisplay fDisp = front.ImageGetImageDisplay(0)
ROI line = fDisp.ImageDisplayGetRoi(0)
if ( line.RoiIsValid() )
{
    if ( line.RoiIsLine() )
    {
        number sx, sy, ex, ey
        line.RoiGetLine( sx, sy, ex, ey )
        number dy = ey - sy
        number dx = ex - sx
        number angle = atan( dy / dx ) + ( dx < 0 ? Pi() : 0 )
        image out := front.Rotate( angle )
        out.ShowImage()
    }
}
person BmyGuest    schedule 14.11.2014
comment
Спасибо, это было очень быстро. Подвопрос: есть ли аналогичная команда для 3D-изображений? - person ; 14.11.2014
comment
Да и нет. Команда Rotate() действует и на 3D-стеки. (Вращение всего стека в плоскости XY), но нет команды для общего 3D-вращения. (Если вы хотите повернуть по XZ или YZ, вы можете сначала «перевернуть» весь стек, а затем применить Rotate().) - person BmyGuest; 14.11.2014
comment
Спасибо. Вращение xy было всем, что я искал сейчас. Но из любопытства: как мне «перевернуть» весь стек на 90 градусов, чтобы f.e. плоскость XY становится видимой плоскостью, параллельной экрану? - person ; 14.11.2014
comment
Используйте команду Slice3(). Вы можете указать начальную точку и любое (ортогональное) направление, а также выборку. Синтаксис Slice3 (изображение, x, y, y, d1, s1, ss1, d2, s2, ss2, d3, s3, ss3) с (x, y, z) начальной точкой и другими 3 триплетами, определяющими 3 оси вашего вывода как измерение, шаги, размер шага. - person BmyGuest; 14.11.2014