MATLAB pcolor/surf билинейная интерполяция (затенение)
Рассмотрим следующий код MATLAB:
C = [ 0 0 0 0 0
0 1 2 1 0
0 2 4 2 0
0 1 2 1 0
0 0 0 0 0 ];
pcolor( C );
shading interp;
axis square
Обратите внимание, что C
инвариантен при поворотах на 90 градусов. Также обратите внимание на это предложение из справки для pcolor
:
С помощью функции затенения каждая ячейка окрашивается путем билинейной интерполяции цветов в четырех вершинах с использованием всех элементов C.
Тем не менее, изображение на графике выглядит следующим образом:
Обратите внимание, что изображение не является инвариантным при поворотах на 90 градусов (рассмотрим, например, четыре угла). Теперь, если я ужасно не пойму билинейную интерполяцию, это должно быть неправильно. MATLAB, кажется, интерполирует на треугольники, что не то же самое, что билинейная интерполяция.
Есть ли способ обойти эту ошибку MATLAB и получить правильную билинейную интерполяцию? (За исключением ручной интерполяции дополнительных точек самостоятельно, что, тем не менее, не решило бы проблему, если бы масштабирование было достаточно большим.)
1 ответ
Я помню, как читал несколько веток об этом странном поведении на официальных форумах Matlab в прошлом. К сожалению, я не нашел ни одного прямо сейчас с быстрым поиском. Во всяком случае... вы не первый использовали, указывая на то, что shading interp
, используется в сочетании с pcolor
ведет себя странным образом, создавая фигуры, которые не отражают основные данные.
Основная проблема заключается в том, что shading interp
интерполирует между точками данных, не заботясь о том, насколько разумна ваша сетка для сглаживания. Если вы хотите, чтобы результат не выглядел неровно, вы должны предоставить данные с более высоким разрешением:
C = [
0 0 0 0 0
0 1 2 1 0
0 2 4 2 0
0 1 2 1 0
0 0 0 0 0
];
C = interp2(C,5,'cubic');
pcolor(C);
shading interp;
axis square;
Это дает потрясающий результат, и на выходе не отображается артефакт или асимметрия: