В моей программе я уменьшаю изображение размером 500px или больше до экстремального уровня около 16px-32px. Исходное изображение указывается пользователем, поэтому я не могу контролировать его размер. Как вы можете себе представить, несколько пиксельных интерполяций остаются в силе, и результат неизбежно сильно смещается.
Я пробовал билинейную, бикубическую и квадратную среднюю выборку. Квадратная средняя выборка фактически дает наиболее приличные результаты, но чем она меньше, тем больше должен быть радиус выборки. В результате он становится довольно медленным - медленнее, чем другие методы интерполяции.
Я также попробовал адаптивную квадратную среднюю выборку, чтобы чем меньше она становилась, тем больше радиус выборки, и чем ближе к исходному размеру, тем меньше радиус выборки. Однако это создает проблемы, и я не уверен, что это лучший подход.
Итак, вопрос в том, какой рекомендуемый тип пиксельной интерполяции является быстрым и хорошо работает на таких экстремальных уровнях уменьшения масштаба?
Я не хочу использовать библиотеку, поэтому мне нужно что-то, что я могу написать вручную, и это не слишком сложно. Я работаю в C ++ с VS 2012.
Вот пример кода, который я попробовал по запросу (надеюсь, без ошибок из моего вырезания и вставки псевдокода). При этом выполняется среднее уменьшение масштаба 7x7, и, хотя это лучший результат, чем билинейная или бикубическая интерполяция, он также требует значительных успехов:
// Sizing control
ctl(0): "Resize",Range=(0,800),Val=100
// Variables
float fracx,fracy;
int Xnew,Ynew,p,q,Calc;
int x,y,p1,q1,i,j;
//New image dimensions
Xnew=image->width*ctl(0)/100;
Ynew=image->height*ctl(0)/100;
for (y=0; y<image->height; y++){ // rows
for (x=0; x<image->width; x++){ // columns
p1=(int)x*image->width/Xnew;
q1=(int)y*image->height/Ynew;
for (z=0; z<3; z++){ // channels
for (i=-3;i<=3;i++) {
for (j=-3;j<=3;j++) {
Calc += (int)(src(p1-i,q1-j,z));
} //j
} //i
Calc /= 49;
pset(x, y, z, Calc);
} // channels
} // columns
} // rows
Спасибо!