Как избежать резких артефактов в виде линий при наложении 3D-рендеринга изоповерхностей?

Я сделал 3D-рендеринг нескольких изоповерхностей в Matlab. Выглядит это так (скриншот, стрелки добавлены позже):

введите здесь описание изображения

Я сделал это, используя такой код:

for i = 1 : n
  fv = isosurface(x, y, z, v{i}, t(i)); % x,y,z being the grid, v being the values, t being the threshold
  p = patch(fv);
  p.FaceColor = [r(i),g(i),b(i)]; % some suitable color value
  p.FaceAlpha = alpha(i); % the alpha value
  p.EdgeColor = 'none';
  isonormals(x, y, z, v, p);
  hold on;
end
camlight;
lighting('gouraud');

который перебирает серию стеков 3D-значений, каждый с другим порогом, цветом и альфа-значением, и отображает их все на рисунке. В частности, здесь у меня были четыре внутренние поверхности, окрашенные в желтый, синий, зеленый, пурпурный цвета с альфа-каналом, равным единице, и четыре внешние поверхности с теми же цветами, но с альфа-каналом, равным 0,1.

Это выглядит нормально, но показывает некоторые артефакты, от которых я хотел бы избавиться.

  • Красными стрелками показаны артефакты в виде линий, вероятно, от пересечений внешних поверхностей.
  • Голубыми стрелками показаны очень четкие цветовые границы на пересечениях внутренних поверхностей.

Я ожидал более плавного рендеринга, который не так сильно подчеркивает пересечения.

Я не хочу, чтобы линия была похожа на артефакты, изображенные красными стрелками, и я хочу, чтобы острые края, изображенные голубыми стрелками, были более гладкими. Конечно, я стремлюсь к решению в Matlab.

Я попытался интерполировать исходные данные, чтобы получить их на более мелкой сетке, но это не имело никакого значения, равно как и попытка уменьшить количество патчей (с reducepatch). Линии пересечения изоповерхностей (голубые стрелки) всегда являются очень жесткими линиями, и установка значений NaN за пределами интересующей области (т. е. ниже самого низкого используемого порога) также не имеет никакого эффекта.

В комментарии говорилось, что может помочь рендеринг в векторный формат, такой как eps/pdf. С Matlab 2019b это не так. Использование print, а не saveas для выбора средства рендеринга painters, поэтому вывод действительно представляет собой векторную графику, что приводит к артефактам. Вывод в epsc не учитывает прозрачность, а вывод в pdf не отображает все патчи полностью. Это их собственные проблемы, и они меня здесь не интересуют.

Просто для полноты здесь вывод в формате pdf (который меня не интересует):

введите здесь описание изображения

print(fig, '-painters', '-bestfit', '-dpdf', 'test.pdf');

person Trilarion    schedule 06.05.2020    source источник
comment
@Adriaan В принципе, я хочу видеть все с этих изоповерхностей. Они гладкие и данные уже ограничены пределами осей. Отдельные поверхности выглядят хорошо. Я только что проверил, что установка всех значений nan ниже самого низкого используемого порога не меняет результат. Рендеринг в векторный формат, такой как eps или pdf, не улучшается (на самом деле ухудшается). Чего я действительно не ожидал, так это увидеть видимые линии в 3D-рендеринге многих поверхностей.   -  person Trilarion    schedule 06.05.2020
comment
попробуйте с export_fig (нужно скачать). Он лучше справляется с экспортом вещей, может быть, это решает проблему   -  person Ander Biguri    schedule 06.05.2020
comment
Однако то, что вы видите на первом рисунке, является нормальным. Определенный пиксель либо зеленый, либо синий, а не оба, поэтому при ограниченном разрешении вы видите такие вещи. Векторная графика имеет неограниченное разрешение при правильном сохранении, но этого может не произойти в вашем случае, так как она сохранит кусочное представление поверхности, и когда эти кусочные представления сталкиваются, она выберет одно или другое. Иногда это может выглядеть некрасиво. Но как видеоигры и причудливые сюжеты не имеют неровных краев?! Вы можете спросить. Сглаживание. Они обманывают ваши глаза. Они смешивают цвета вместе.   -  person Ander Biguri    schedule 06.05.2020
comment
Возможно, это сработает: uk.mathworks.com/help/matlab /creating_plots/   -  person Ander Biguri    schedule 06.05.2020
comment
@AnderBiguri Это может быть нормально в том смысле, что это задумано программным обеспечением, но, безусловно, могло бы выглядеть лучше. Вопрос в основном в том, как заставить его выглядеть по-другому. Я попробую ваши предложения, а затем отчитаюсь. Возможно, ответ в том, что Matlab не может сделать это лучше. Я тоже в порядке с этим, но я хотел бы попробовать больше, прежде чем решить это.   -  person Trilarion    schedule 06.05.2020
comment
Но научные сюжеты должны быть сначала точными, а потом хорошо выглядеть. Сглаживание улучшит внешний вид, но может скрыть основную информацию о графике.   -  person Ander Biguri    schedule 06.05.2020
comment
@AnderBiguri Полностью согласен и думаю, что в данном случае все в порядке. Неясно даже, реальны ли линейные структуры или это просто артефакт рендеринга, который может исчезнуть при других настройках. Для целей этого вопроса я просто хочу, чтобы они исчезли, даже если это скрывает основную информацию.   -  person Trilarion    schedule 06.05.2020
comment
Единственное, о чем я могу думать, это о предложениях по сглаживанию, которые я вам дал. Я думаю, что export_fig тоже имеет такие возможности. Однако они могут не работать. Пожалуйста, сообщите о своих выводах.   -  person Ander Biguri    schedule 06.05.2020