Проблема обработки изображения: заполнение изображения NaN, которое в основном состоит из NaN.

У меня есть набор данных/изображение DD, как на этом изображении:

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

(кстати: есть ли способ загружать сюда небольшие наборы данных, чтобы вы могли работать с теми же данными, которые использую я, без необходимости помещать их в код?)

Цветные пиксели на изображении представляют высоту/глубину в диапазоне от 0 до примерно 400 метров. Синие пиксели NaN.

Теперь мне нужно интерполировать значения пикселей ВНУТРИ отображаемого объекта, но без интерполяции всего изображения.

Пробовал использовать функцию inpaint_nans из файлообменника, которая мне не раз выручала и опять же, неплохо сработала:

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

imagesc(inpaint_nans(DD,4))

Тем не менее, время выполнения довольно велико для больших изображений ~ 3000x3000 пикселей (а у меня их несколько!), И это не совсем то, что я ищу. Может быть, в наборе инструментов для обработки изображений есть функция, которая ограничивает интерполяцию существующими границами моего объекта без учета окружающих NaN?

Я также использовал interp2 вот так:

[xi,yi] = meshgrid(1:size(DD,2),1:size(DD,1));
zi = interp2(xi,yi,DD,xi,yi,'method');
imagesc(zi)

где я пробовал linear, nearest и cubicдля method. Ни один из них не выполнил задание. nearest ничего не делал, а остальные удаляли все больше и больше "хороших" пикселей и заменяли их на NaNс. Любая помощь или предложения будут оценены!

РЕДАКТИРОВАТЬ: ОБРАБОТКА:

Я провел симуляцию в другой программе, основанной на треугольных сетках. Для каждого узла сетки (X,Y) глубина воды записывается в файл ascii. В центре потока 2 треугольника умещаются в один пиксель (90x90 метров), например, я получаю значения глубины воды для углов пикселя, а не для самого пикселя. В окружении моделирование работает с большим интервалом (как видно из обычных значений NaN в пойме). Здесь 2 треугольника составляют прямоугольник размером 180х180 метров (4 пикселя). Поскольку я снова получаю значения только для узлов треугольников, расчетное значение глубины воды присваивается каждой секунде, а не каждому пикселю. Теперь я подумал, что самым простым методом будет интерполяция между пикселями. Другим допустимым (возможно, лучшим) решением было бы присвоение значения узла (глубины) окружающим 2/4 пикселям:   нет описания


person TheodorBecker    schedule 07.06.2013    source источник
comment
Если он не слишком велик, вы можете просто разместить свои данные здесь в виде блока кода. В противном случае используйте pastebin или аналогичный.   -  person Rody Oldenhuis    schedule 07.06.2013
comment
Синие пиксели между цветными блоками в вашем оригинале тоже NaN?   -  person Rody Oldenhuis    schedule 07.06.2013
comment
@Rody Спасибо за совет! Я проверю pastebin. 90x100 пикселей может быть слишком большим, чтобы просто вставить их сюда. И ДА, синие пиксели внутри цветных объектов также являются NaN. На самом деле, это те, которые мне нужно заполнить! Меня не волнуют те, что снаружи объекта (=река), но те, что внутри, имеют решающее значение. Они являются результатом преобразования треугольных данных обратно в растровые данные!   -  person TheodorBecker    schedule 07.06.2013
comment
хммммммм... это последнее предложение вызывает здесь несколько тревожных сигналов... Итак, если я вас правильно понял, вы получаете данные в какой-то триангуляции, конвертируете эти данные в сетку с равными интервалами, и теперь вы хотите снова интерполировать попытаться исправить ущерб от этого преобразования? Для меня это звучит как уничтожение данных, что может и не понадобиться... Не могли бы вы опубликовать немного больше информации о том, что вы пытаетесь сделать?   -  person Rody Oldenhuis    schedule 07.06.2013
comment
Я не думаю, что 90x100 слишком велик... Магия SO в любом случае уменьшит размер вашего блока до чего-то разумного :) Просто используйте format short (если вы используете double) и скопируйте и вставьте его сюда   -  person Rody Oldenhuis    schedule 07.06.2013
comment
@Rody: Что касается копирования-вставки: данные не подходят. Пост ограничен 30к символов, мой будет >60к. Я отредактирую шаги обработки в посте выше!   -  person TheodorBecker    schedule 07.06.2013


Ответы (2)


Вы можете попробовать функцию TriScatteredInterp. Это хорошо работает в моем простом тесте:

% create an image with holes
x = im2double(imread('rice.png'));
x(1:4:end, 1:4:end) = nan;
x(rand(size(x))<.1) = nan;
figure; imshow(x);

% setup the grid to interp from
[m n c] = size(x);
[N M] = meshgrid(1:m, 1:n);
Ni = N;
Mi = M;

Mi(~isnan(x)) = [];
Ni(~isnan(x)) = [];

N(isnan(x)) = [];
M(isnan(x)) = [];
Z = x(~isnan(x));

% do the interp
F = TriScatteredInterp(M', N', Z);
Zi = F(Mi, Ni);

xi = x;
xi(sub2ind(size(x),Mi, Ni)) = Zi;
figure; imshow(xi);
person Tokkot    schedule 22.08.2013

У меня была аналогичная ситуация, и у меня сработал простой imdilate. TriScatteredInterp работает довольно медленно. Сообщение довольно старое, но, возможно, кому-то будет полезен следующий код:

imgDepth = load('depthImage.mat') % Or imread('depthImage.png')
imgDepth(isnan(imgDepth)) = 0
radius = 10 % Change as per your data
se = strel('disk',radius) % Try different structuring elements as per your need
imgDilated = imdilate(imgDepth,se);
figure,imshow(imgDilated,[]),colormap(jet)
person dbs    schedule 10.05.2015