Подтвердить что ты не робот

Contourf и NaNs (как сделать белые области прозрачными)

Я пытаюсь создать график contourf, но некоторые области массива данных имеют NaN (только в матрице данных, матрицы x и y meshgrid заполнены). Я бы хотел, чтобы эти NaN были прозрачными, и они предназначены для NaNs на границе прямоугольника. Но смежные области NaN внутри матрицы данных являются белыми, а не прозрачными. Ниже приведен пример:

код:

[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
contourf(X,Y,Z);
colormap jet;

Вывод:

enter image description here

Подсказка:

Добавление вышеуказанного кода с помощью:

% Find Face
set(findobj(h,'FaceColor',[1 1 1]),'FaceAlpha',0))

Найдите белый объект патча и установите его прозрачным. К сожалению, патч под ним заполнен:

enter image description here

Обновление: взятие области NaN и наложение фонового изображения на результат:

enter image description here

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

4b9b3361

Ответ 1

Основываясь на ответе H. Muster, я искусственно создал группы, сегментируя данные (вы могли бы использовать простую функцию для выбора групп или создавать их с помощью contour на фиктивной фигуре, возвращать их и повторно -используйте их).

[X Y] = meshgrid(10:0.1:50);
Z = X.*Y;
Z(100:300,100:300) = NaN;
figure
hold on;
h = pcolor(X,Y,round(Z/500)*500);
set(h,'Edgecolor',  'interp');
colormap jet;
set(gca, 'XLim', [0 60], 'YLim', [0 60]);

Я боюсь, что у меня нет панели инструментов, которая включает imread, поэтому не может показать базовый градиент, но я думаю, что это сработает. Я должен был увеличить разрешение в 10 раз, чтобы получить достаточно гладкое изображение.

enter image description here

Ответ 2

Можно ли использовать pcolor вместо contourf?

[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
h = pcolor(X,Y,Z)
set(h,'Edgecolor',  'interp');
colormap jet;

enter image description here