Matlab: принудительная установка значений пикселей в NaN, соответствующих ненулевым значениям в маске - PullRequest
0 голосов
/ 01 ноября 2018

Я экспериментирую с исправлением краевых артефактов в частично законченных RGB-изображениях, таких как half5 , правая половина мозаичного изображения p31m, с помощью различных методов, таких как рисование с помощью inpaint_nans . Поскольку положение краев известно аналитически, я сначала рисую серую маску того же размера с помощью insertShape outmask_h . Теперь я хочу заставить те пиксели от половины5 до NaN, которые соответствуют ненулевым пикселям outmask_h, получить NaN, необходимые для inpaint_nans, поэтому я попробовал

[r,c] = find(outmask_h);                                                
for i = 1:length(r); half5(r(i),c(i)) = NaN; end

Сначала я подумал, что это нормально, потому что запись результата показывает черные пиксели, где маска отлична от нуля, но результат после inpaint_nans выглядит так же, как и раньше, и подсчет NaN в одном из каналов дает 0, так что это неправильно (почему ?).

Кажется, что работает противоположная стратегия (создание массива NaN и замена нулевых пикселей), НО это слишком медленно

half5n = NaN(size(half5,1), size(half5,2), 3);
[r,c] = find(outmask_h==0);
for i = 1:length(r); half5n(r(i),c(i)) = half5(r(i),c(i)); end

1 Ответ

0 голосов
/ 01 ноября 2018

Вы можете использовать массив outmask_h в качестве индекса logical (сначала убедитесь, что он logical), а затем применить его к каждому каналу изображения перед передачей его в inpaint_nans.

Также, как указано в комментариях, убедитесь, что ваша входная матрица равна double, иначе назначение со значениями NaN приведет к 0 's

half5 = double(half5);

mask = logical(outmask_h);

new = zeros(size(half5));

for k = 1:size(half5, 3)
    channel = half5(:, :, k);
    channel(mask) = NaN;

    new(:,:,k) = inpaint_nans(channel);
end

Если вместо этого вы хотите превратить ненулевые значения в NaN, вы можете использовать обратное значение outmask_h

mask = ~outmask_h;
...