sinc-фильтр 2d-изображения без рескейлинга.
-
-
22.10.2021 #76593
Николай
Ключникsdv_cyborg 22 окт 2021, 17:26Прошу помощи у тех, кто углубленно знает image processing.
Возможно ли каким-либо образом реализовать антиалиасинговые sinc-фильтры (вроде алгоритма Ланцоша) без рескейлинга? Вводные такие: есть изображение, которое суть обрезанный и рескейленный кусок другого изображения – при этом рескейлер, который это сделал, никакого улучшения изображения не делает – выдает как есть, с линейной интерполяцией, соответственно несколько смазанное. Надо бы теперь сделать немного более резким. Кто подскажет, подходит для этого тот же алгоритм Ланцоша или он требует обязательной операции масштабирования и, соответственно, данных об исходном и масштабированном изображении? Или какой другой алгоритм существует, который имея только апостериорные данные о картинке, сможет ее улучшить?aamonster 22 окт 2021, 22:54Lancoz тут напрямую не применить. Но если есть некая информация о том, что сделали с картинкой, улучшить её можно.
Например, если картинку увеличивали билинейной интерполяцией и известен исходный размер – можно восстановить исходную картинку (навскидку алгоритм не набросаю, но в целом – сведётся к решению систем линейных уравнений с трёхдиагональной матрицей), а потом уже её отрескейлить нормально.
Если размер неизвестен, но точно знаем, что была билинейная интерполяция – можно попытаться его определить (при сильном увеличении подход довольно очевиден: найти квадраты, явно сделанные билинейной интерполяцией, при небольшом увеличении сложней, но тоже можно).aamonster 22 окт 2021, 22:56Можно попытаться и подобрать фильтр, который улучшит вашу картинку (по сути она ведь просто замылена). Но не рекомендую такой подход: дело в том, что замыленность неравномерна, и если не учесть явно соотношение размеров, то при поднятии резкости вы получите муар.sdv_cyborg 22 окт 2021, 23:07Исходный размер известен, к счастью. Но решение системы уравнений – это, конечно, ядрено. Хотя надо бы поизучать, заодно мозги освежить.
Можете подсказать, что можно почитать про этот метод с трехдиагональной матрицей, что вы упомянули? В уме при этом названии всплывает матрица Якоби и ее порождение из нелинейной модели в EKF… Но это точно не из той оперы.Eddy_Em 23 окт 2021, 00:41Посчитай границы методом Канни, а потом с неким коэффициентом добавь их к изображению. Все равно у тебя аппаратная функция неизвестна, так что декомпозицию не с чем делать.sdv_cyborg 23 окт 2021, 11:44Eddy_Em писал(а):Посчитай границы методом Канни, а потом с неким коэффициентом добавь их к изображению. Все равно у тебя аппаратная функция неизвестна, так что декомпозицию не с чем делать.Интересная мысль. Не лучший вариант, но можно поэкспериментировать, в условиях ограниченного времени на реализацию.
aamonster 23 окт 2021, 17:29Ну, там несложная система.
1 Билинейную интерполяцию можно рассматривать, как две отдельные линейные (по строкам и по столбцам). Итого – вначале избавляемся от результатов интерполяции по x, потом по y.
2. Для начала считаем коэффициенты линейной интерполяции. Там будет что-то типа
y_j = (1-a_j)*x_i+a_j*x_(i+1), где i – целая часть j*scale, a_j – дробная (но возможны нюансы)
Коэффициенты можно проверить, взяв картинку с белой вертикальной или горизонтальной однопиксельной полосой и увеличив её.
3. Ну а дальше идём по строке и, зная x_i, считаем x_(i+1) (там для одной пары будет несколько уравнений, из них надо выбрать то, где a_j больше – для бОльшей точности и устойчивости).
Как-то так.
Кстати, если увеличивается в целое количество раз – халява, достаточно проредить картинку.
А если на ощущениях – то интерполированная картинка мало того что увеличена – она делится на чередующиеся области: где a_j близко к 0 или 1 – сохранены пиксели исходной, где к 0.5 – они размыты (среднее от соседних пикселей). Это хорошо видно, если взять картинку шахматной доски из чёрных и белых пикселей и увеличить (размытие даст серый). Поэтомы методы, равномерно фильтрующие всё увеличенное изображение, вроде предложенного Эдди, дают так себе результат.sdv_cyborg 23 окт 2021, 19:46Так, кажется, начинаю догонять. Обдумаю это все, выглядит логично…sdv_cyborg 23 окт 2021, 22:11Так, немного уточнений.
1. Я правильно понимаю, что несколько уравнений у нас на каждый y[j] из-за того, что нам надо подобрать соответствующую пару x[i] и x[i+1]? И посему выбрать как раз среди этих пар мы должны те, у которых a_j самое большое, потому что будет показывать значение самого близкого к исходному пикселя?
2. Выходит, мне при таком подходе и не надо применять к системе уравнений метод прогонки для решения? Потому что один за другим подходящий пиксель найду исходя из описанной методики.
P.S. Заранее извиняюсь, если вопросы тупые – давно уже не имел дела с линейной алгеброй…aamonster 23 окт 2021, 23:141 – да. Типа если мы увеличили картинку в 3? раза – у нас наш исходный пиксел x_i войдёт в 3-4 последовательных пиксела на картинке-результате, надо из них выбрать (и более менее пофиг, какой – но лучше всё-таки избегать деления на маленькое число, так что берём где a_j побольше)
2 – ну да, матрица оказалась не трёхдиагональной, а двух). (offtopic: прогонка, кстати, не шибко сложнее, просто пробежаться пришлось бы вначале туда, потом обратно, а тут только туда).aamonster 23 окт 2021, 23:19Главное, чтобы не было какой подставы – типа картинка не билинейной интерполяцией обработана, а хитрым авторским алгоритмом 🙂
Да, и ещё: уравнения в каждой строке одинаковые, так что решить их можно 1 раз – получив фильтр-строку для быстрого вычисления (избавиться от деления, оставив только умножение и вычитание).
-
Viewing 0 reply threads
- Вы должны войти в систему, чтобы ответить в этой теме.