Вращающиеся изображения в Python - PullRequest
1 голос
/ 10 апреля 2019

У меня был вопрос о реализации метода scipy ndimage.rotate, конкретно касающегося того, как он на самом деле работает при повороте массива на произвольную величину, и сохраняет ли он числа, содержащиеся в массиве?

Я пытаюсь найти способ вращения некоторых массивов, сохраняя при этом числа в массиве и не теряя никакой информации.

Я пытался протестировать его, инициализируя некоторые массивы с известными формами внутри него, но я заметил, что если вы инициализируете некоторые конкретные формы, такие как кресты, то при повороте на определенную величину крест станет квадратом и я обеспокоен тем, что теряю информацию здесь.

matr_1= [[0, 1, 0, 0, 0, 0],
    [1, 1, 1, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 0, 0, 1, 0]]

 matr_2= [[0, 0, 1, 0, 0, 0],
    [0, 1, 1, 1, 0, 0],
    [0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 0, 0, 1, 0]]

plt.imshow(matr_1)

plt.show()

print("Rotation by 45 degrees")

print(sp.ndimage.rotate(matr_1, 45, reshape=False)) 

plt.imshow(sp.ndimage.rotate(matr_1,45,reshape=False))

plt.show()

print("Rotation by 55 degrees")

print(sp.ndimage.rotate(matr_2, 90, reshape=False))

plt.imshow(sp.ndimage.rotate(matr_1,90,reshape=False))

Я понимаю, что это может быть проблемой, присущей всем алгоритмам ротации, но я хочу понять, какие операции на самом деле применяются к массивам.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Это хорошее упражнение для чтения кода библиотеки с открытым исходным кодом, которую вы используете, когда сомневаетесь.Вот ссылка:

https://github.com/scipy/scipy/blob/v1.2.1/scipy/ndimage/interpolation.py#L634

Вы заметите, что вращение определяется матрицей вращения, здесь определяемой как:

    m11 = math.cos(angle)
    m12 = math.sin(angle)
    m21 = -math.sin(angle)
    m22 = math.cos(angle)
    matrix = numpy.array([[m11, m12],
                          [m21, m22]], dtype=numpy.float64)

в дискретных изображениях,потеря возможна для углов, не кратных 90.

0 голосов
/ 10 апреля 2019

Можно вращать изображение и использовать Ближайший сосед Интерполяция.Это означает, что вместо взятия рассчитанного процента каждого из соседних пикселей для каждого местоположения в новом растре (сетке) алгоритм ограничен выбором ближайшего соседа из существующего растра.

Это означает, что нетновые значения пикселей (в основном цвета или оттенки серого) будут введены в изображение.То есть, если вы начали с белого прямоугольника на черном фоне, независимо от того, на сколько градусов вы его повернули, вы никогда не получите один новый серый пиксель для сглаживания неровного края - все выходные пиксели будут оставаться черными или белыми.

Я не уверен в точной математике, но я не верю, что это означает, что точное количество черно-белых пикселей во входном изображении будет сохранено, но значения будут сохраняться, поскольку нет новых,будут введены разные значения.

Я не могу судить по тому, как сформулирован ваш вопрос, если это вариант для вас.

...