Как я поворачиваю изображение?

Просто так.

response.categories.forEach { print([110].categoryName) }
9
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Обычный способ решить это путем выполнения его назад. Вместо того, чтобы вычислить, где каждый пиксель во входном изображении заканчивается в выходном изображении, Вы вычисляете, где каждый пиксель в выходном изображении расположен во входном изображении (rotationg та же сумма в другом направлении. Таким образом, можно быть уверены, что все пиксели в выходном изображении будут иметь значение.

output = new Image(input.size())

for each pixel in input:
{
  p2 = rotate(pixel, -angle);
  value = interpolate(input, p2)
  output(pixel) = value
}

Существуют различные способы сделать интерполяцию. Для формулы вращения я думаю, что необходимо проверить https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions

Но только быть хорошим, здесь это - (вращение точки (x, y) угловые градусы/радианы):

 newX = cos(angle)*x - sin(angle)*y
 newY = sin(angle)*x + cos(angle)*y
31
ответ дан 4 December 2019 в 06:41
поделиться

Примечание там является другим решением кроме матриц вращения, которое не освобождает данные изображения посредством искажения. Можно разделить 2D поворот изображения на скосы и масштабирования, которые сохраняют качество изображения.

Вот более простое объяснение

2
ответ дан 4 December 2019 в 06:41
поделиться

На пример кажется, что Вы обеспечили, некоторое граничное ядро обнаружения. Таким образом, если то, что Вы хотите, обнаруживают края различных углов, необходимо выбрать некоторую непрерывную функцию (который в случае мог бы быть параметрическим гауссовым из x1, умноженного на x2), и затем поверните его согласно формулам, обеспеченным kigurai. В результате Вы смогли бы произвести дискретное ядро более эффективно и без искажения.

0
ответ дан 4 December 2019 в 06:41
поделиться

Чтобы повернуть изображение, вы создаете 3 точки:

A----B 
|
|
C

и поворачиваете их вокруг A. Чтобы получить В новом повернутом изображении вы сделаете это:

  • поверните ABC вокруг A в 2D, так что это один поворот эйлера
  • в повернутом состоянии от A до B. Для каждого пикселя, который вы проходите также слева направо над горизонтальная линия в исходном изображении. Поэтому, если изображение представляет собой изображение шириной 100, высотой 50, вы пройдете от А до В за 100 шагов и от А до С за 50 шагов, нарисовав 50 линий по 100 пикселей в области, образованной ABC, в их повернутом состоянии. , 1231 Это может показаться сложным, но это не так. Пожалуйста, посмотрите этот код C #, который я написал некоторое время назад: так что это один поворот Эйлера
  • в повернутом состоянии от А до В. Для каждого пикселя вы также перемещаетесь слева направо по горизонтальной линии исходного изображения. Поэтому, если изображение представляет собой изображение шириной 100, высотой 50, вы пройдете от А до В за 100 шагов и от А до С за 50 шагов, нарисовав 50 линий по 100 пикселей в области, образованной ABC, в их повернутом состоянии. , 1231 Это может показаться сложным, но это не так. Пожалуйста, посмотрите этот код C #, который я написал некоторое время назад: так что это один поворот Эйлера
  • в повернутом состоянии от А до В. Для каждого пикселя вы также перемещаетесь слева направо по горизонтальной линии исходного изображения. Поэтому, если изображение представляет собой изображение шириной 100, высотой 50, вы пройдете от А до В за 100 шагов и от А до С за 50 шагов, нарисовав 50 линий по 100 пикселей в области, образованной ABC, в их повернутом состоянии. , 1231 Это может показаться сложным, но это не так. Пожалуйста, посмотрите этот код C #, который я написал некоторое время назад: рисование 50 линий по 100 пикселей в области, образованной ABC, в их повернутом состоянии. 1231 Это может показаться сложным, но это не так. Пожалуйста, посмотрите этот код C #, который я написал некоторое время назад: рисование 50 линий по 100 пикселей в области, образованной ABC, в их повернутом состоянии. 1231 Это может показаться сложным, но это не так. Пожалуйста, посмотрите этот код C #, который я написал некоторое время назад: rotoZoomer от меня

    При рисовании я немного изменяю указатели источника, чтобы получить резиноподобный эффект, но если вы отключите это, вы увидите, что код поворачивает изображение без проблем. Конечно, под некоторыми углами вы получите изображение, которое выглядит слегка искаженным. Исходный код содержит комментарии о том, что происходит, поэтому вы сможете легко понять математику / логику.

    Если вам больше нравится Java, я также однажды сделал 14-летнюю версию java;) -> http://www.xs4all.nl/~perseus/zoom/zoom.java

2
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: