Вы понижаете выборку , а не повышаете выборку . Сама интерполяция прекрасно работает при повышении частоты дискретизации (увеличение количества пикселей).
При понижающей дискретизации, либо с нашей без интерполяции, вы выбрасываете информацию и получаете псевдонимы. Это эффект, который вы видите в своем результате.
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));