Проблема различия между gimp bicubic и стандартным bicubic - PullRequest
0 голосов
/ 27 июня 2018

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

Difference images

Как вы можете видеть выше 2 изображения (A) это Gimp's (B) мой собственный код со ссылкой.

Я запутался, что я что-то не так сделал? Должен ли я изменить алгоритм?

Не могли бы вы дать совет?

1 Ответ

0 голосов
/ 27 июня 2018

Вы понижаете выборку , а не повышаете выборку . Сама интерполяция прекрасно работает при повышении частоты дискретизации (увеличение количества пикселей).

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

Gimp при понижающей дискретизации сначала сглаживает изображение. Сглаживание удаляет более высокие частоты, которые в противном случае были бы наложены.

Чтобы получить результаты, аналогичные Gimp, примените фильтр нижних частот перед понижением частоты дискретизации.


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

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

s1 - это просто понижающая дискретизация без сглаживания. Похоже, ваш результат. Это псевдоним.

s2 и s3 используют гауссовские фильтры нижних частот разных размеров. Я использовал сигмы 8*0.5 и 8*0.8 здесь. После понижающей выборки они соответствуют сигмам 0,5 и 0,8 соответственно. Первый немного маловат, он все же демонстрирует некоторый псевдоним, но намного меньше. Это также все еще острый. Второй - правильный размер, чтобы предотвратить наложение (менее 1% энергии или около того является псевдонимом).

s4 использует идеальную фильтрацию нижних частот (в области Фурье). Я не рекомендую этот метод, потому что он вызывает много звонков. Это просто здесь для сравнения. В выходных данных присутствует псевдоним 0%, и результат настолько резкий, насколько это возможно.

a = readim('https://i.stack.imgur.com/1TyGI.jpg');
a = a{1};

f = 8; % subsample by a factor 8

s1 = a(0:f:end,0:f:end);

s2 = gaussf(a,f*0.5);
s2 = s2(0:f:end,0:f:end);

s3 = gaussf(a,f*0.8);
s3 = s3(0:f:end,0:f:end);

s4 = ft(a);
s4 = cut(s4,imsize(s1));
s4 = real(ift(s4) / numel(a) * numel(s4));

the 4 images computed above

...