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 и получить правильную билинейную интерполяцию? (Кроме того, что я вручную интерполирую дополнительные точки, что все равно не решит проблему, если увеличить масштаб достаточно далеко.)


person cfp    schedule 18.11.2017    source источник
comment
Интересно отметить, что это дает ту же окраску, что и surf(C); shading('interp'); view(2);   -  person jodag    schedule 18.11.2017
comment
да. Он явно образует сетку из треугольников. Какой-то программист MATLAB не понял, что такое билинейная интерполяция.   -  person cfp    schedule 18.11.2017
comment
Правильно ли я понимаю: вы не хотите использовать полученную цифру только в целях иллюстрации (чтобы вы могли просто интерполировать себя и использовать png с разрешением 300 точек на дюйм разумного размера), а скорее провести дальнейший анализ на ней? Если так, я бы посоветовал вам попробовать латекс / тикз. Вы об этом думали?   -  person thewaywewalk    schedule 22.11.2017
comment
Я после публикации качественного изображения. Поэтому я бы предпочел сохранить в векторном формате и быть уверенным, что он будет произвольно хорошо масштабироваться. На самом деле это не нацелено на LaTeX, хотя вывод MATLAB в формате EPS / PDF на самом деле больше проблематичен, чем вывод в формате EMF / SVG. В любом случае, однако, рисунок экспортируется (даже если, например, используется matlab2tikz), он сохранит неправильную интерполяцию.   -  person cfp    schedule 23.11.2017


Ответы (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;

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

Вывод

person Tommaso Belluzzo    schedule 18.11.2017
comment
ОП: Кроме того, что я вручную интерполирую дополнительные точки, что все равно не решит проблему, если увеличить масштаб достаточно далеко. - person jodag; 18.11.2017
comment
Это решение, к которому я прибегал самостоятельно. Но это далеко не идеально. Во-первых, сохранение в формате SVG / EMF дает очень плохие результаты с такими мелкими сетками, создавая огромные файлы с множеством артефактов (например, белых линий). - person cfp; 18.11.2017
comment
Запустите следующий код и просмотрите два сгенерированных файла. Для меня EMF имеет вертикальную белую линию посередине (а если вы используете interp2 (C, 5), у нее много таких линий). SVG показывает четкие треугольники. С = [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]; С = интерп2 (С, 3); pcolor (C); шейдинг интерп; ось квадратная; палитра (parula (2 ^ 16)); Drawow; saveas (gcf, 'out.emf'); saveas (gcf, 'out.svg'); - person cfp; 19.11.2017