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.

Тем не менее, изображение на графике выглядит следующим образом:

CodeOutput

Обратите внимание, что изображение не является инвариантным при поворотах на 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;

Это дает потрясающий результат, и на выходе не отображается артефакт или асимметрия:

Выход

Другие вопросы по тегам