Является ли вращение операцией с потерями (для углов, не кратных 90 градусам)? - Фотопедия
6 голосов
/ 23 августа 2013

Заявление mattdm " о том, что размытие в значительной степени обратимо, если вы делаете то же самое в обратном порядке ", подняло вопрос в моей голове. Поворот - это геометрическое преобразование изображения, состоящее из пространственного преобразования координат и интерполяции интенсивности. Если поворот не кратен 90 градусам, то алгоритм интерполяции играет решающую роль.

В таких случаях, если мы используем алгоритм интерполяции с усреднением (например, бикубический), операция с потерями *. Но можем ли мы вместо этого использовать другой подход (например, интерполяцию ближайшего соседа) и сделать наше повернутое изображение «не повернутым»?

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


Хотя мне не хватает необходимых математических навыков, я сам выполнил несколько тестов (с gimp), но после антивращения изображения отличаются:

Тест 1

source image

Рисунок 1 - Исходное изображение (256x256)

NN Rotated 9,5 degrees, rotated -9,5 degrees, difference

Рисунок 2 - Слева направо: а) изображение повернуто на 9,5 градусов по часовой стрелке; б) изображение снова повернуто на 9,5 градусов против часовой стрелки; и в) разница между изображениями. Для этих операций я использовал ближайший сосед интерполяция. Изображения уменьшаются после выполнения операций, чтобы лучше соответствовать макету сайта.

bicubic Rotated 9,5 degrees, rotated -9,5 degrees, difference Рисунок 3 - Слева направо: а) изображение повернуто на 9,5 градусов по часовой стрелке; б) изображение снова повернуто на 9,5 градусов против часовой стрелки; и в) разница между изображениями. Для этих операций я использовал бикубическую интерполяцию. Изображения уменьшаются после операций, чтобы лучше соответствовать макету сайта.

Тест 2

Следуя предложению @ unapiedra, я сделал более простой тест: вращение матрицы 2x2. Этот случай неинтересен, поскольку в зависимости от угла все ячейки поворачиваются на один и тот же угол, или ни одна ячейка не поворачивается. То есть вращение всегда без потерь.

Итак, я попытался снова с матрицей 3x3 и поворотом на 30 градусов:

rotating a 3x3 matrix without scaling

Рисунок 4 - Слева направо: а) исходное изображение; б) изображение повернуто на 30 градусов по часовой стрелке; в) изображение повернуто на 30 градусов против часовой стрелки; г) разница. Изображения увеличены, чтобы соответствовать этому сайту.

В этом случае различия очевидны. Вращение явно с потерями ... Но что произойдет, если я увеличу масштаб до вращения?

Тест 3

rotating a previously upscaled 3x3 matrix

Рисунок 5 - Слева направо: а) исходное изображение; б) изображение увеличено в 6 раз; в) увеличенное изображение повернуто на 30 градусов по часовой стрелке; г) изображение повернуто на 30 градусов против часовой стрелки; д) уменьшенное преобразованное изображение; и е) разница (без разницы). Изображения увеличены, чтобы соответствовать этому сайту.

В этом случае я увеличиваю масштаб в 6 раз. Обоснование выбора этого фактора (к сожалению, неверно, как я видел в контрпримере):

Пиксель, повернутый на 30 градусов, имеет координаты снизу слева направо: [0,0] - [0,3660, 1,3660]. То есть самая короткая проецируемая сторона имеет длину 0,36 пикселей. Теорема выборки требует, чтобы мы производили выборку с двойной скоростью.

Таким образом, для точной выборки изображения, повернутого на 30 градусов, я должен дискретизировать каждые 0,17 пикселя, получая коэффициент изменения размера х 5,88; 3 x 5,88 = 17,64, таким образом, я ресамплирую исходное изображение в изображение 18x18.

Ответы [ 5 ]

9 голосов
/ 23 августа 2013

Поворот изображения - это операция с потерями, но поворот изображения один раз, а затем его обратное вращение, вероятно, теряет очень мало деталей, особенно по сравнению с обычным сжатием JPEG.


Вращение изображения работает так математически:

Изображение уровня серого состоит из значений яркости L_(x,y) при целых положениях пикселей x, y. Сначала создается функция действительного аргумента f(x,y), которая воспроизводит значения L_(x,y) в тех же позициях x,y, но также дает значения в нецелом x,y. Следовательно, он интерполирует между целочисленными x,y позициями (именно здесь используются методы интерполяции - есть несколько возможных вариантов для f(x,y)).

Затем построите повернутую версию g(x,y) = f( x cos(a) - y sin(a), x sin(a) + y cos(a) ) под углом a. Эта операция выполняется без математических потерь, не считая ошибок округления при выполнении расчетов на компьютере с конечной точностью.

Наконец, g(x,y) значения рассчитываются в целых x,y позициях снова для создания изображения.


В этот момент вы можете спросить: почему эта потеря? Разве мы не можем просто перевернуть все эти вычисления, чтобы восстановить исходный необращенный L_(x,y), если мы знаем, какой метод интерполяции использовался для построения f?

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

Кроме того, если значения g(x,y) были округлены с низкой точностью (8 бит, 0..255), потери информации еще больше.


Много накопленных вращений будет эффективно размыть изображение. Вот пример поворота изображения Лены размером 500 на 500 пикселей 30 раз на 12 градусов, что соответствует полному повороту на 360 градусов:

enter image description here


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

Но есть одна загвоздка: размытие нечувствительно к небольшим изменениям исходного изображения. Если вы смажете два похожих изображения, вы получите еще более похожие результаты. Де-размытие очень чувствительно к небольшим изменениям: если вы размыли два немного отличающихся изображения, вы получите два совершенно разных результата. Обычно мы не работаем с высокой точностью (на самом деле 8 бит - это довольно низкая точность), и ошибки округления будут увеличиваться при попытке изменить размытие.

Это причина, по которой размытие является «необратимым» и почему оно теряет детали.

5 голосов
/ 23 августа 2013

В общем случае вращение не с потерями, а в сочетании с изображениями.

Причина заключается в объединении значений пикселей вместе. Если изображение повернуто, расположение большинства пикселей не будет идеально совпадать со структурой сетки изображения. Теперь необходима интерполяция, чтобы решить, где разместить значение этого пикселя.

При интерполяции ближайшего соседа значение пикселя перемещается в ближайшую ячейку сетки (местоположение пикселя).

В бикубической интерполяции значение пикселя влияет на все близкие ячейки сетки в окрестности, по сути, значение распределяется на близкие пиксели.

2 голосов
/ 23 августа 2013

Если вы достаточно увеличите разрешение, я думаю, вы сможете сделать его без потерь, но я думаю, что оно должно быть немного больше. По сути, вам необходимо «заполнить» достаточное количество пикселей, чтобы погрешность сводилась к ошибке округления при обратном выполнении операции и уменьшении разрешения до исходного. Однако в этот момент вы могли бы просто сохранить исходное изображение в скрытом слое изображения, поскольку вы добавляете значительно больше точек данных, чем займет копия изображения.

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

1 голос
/ 23 августа 2013

Поворот на «некардинальные» углы всегда будет с потерями из-за конечной точности в числах (и методах) с плавающей точкой, используемых при выполнении вращения.

Обратите внимание, что "с потерями" не всегда означает "заметно с потерями".

1 голос
/ 23 августа 2013

Теория AJ об увеличении разрешения верна. Проблема заключается в относительном размере ячеек (пикселей) к деталям, которые мы можем разобрать. Чем больше ячеек, тем больше мы должны засунуть результаты в бункеры. Здесь я вращаюсь с бикубической интерполяцией с +10 и -10 и сравниваю с абс (I1-I2). Во-вторых, я делаю изменения размера lanczos x10, вращаюсь с бикубической интерполяцией с +10 и -10 и изменяю размер до исходного размера и сравниваю с abs (I1-I2).

Resize effect

Существенная разница в распределении ошибок:

Stats

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...