Замена индексов на нежелательное значение их ближайшим значением индекса, которое оказывается положительным - PullRequest
3 голосов
/ 15 января 2020

Этот вопрос отличается от предыдущего вопроса ( Как найти индексы с отрицательным значением и заменить значение ближайшим значением индекса, которое оказывается положительным? ). Предыдущий вопрос состоял в том, чтобы заменить нежелательное значение индекса значением ближайшего положительного индекса в той же строке .

Этот вопрос должен заменить нежелательное значение значением ближайшего положительного индекса по всей матрице (не ограничиваясь только одной строкой) .

  • Если имеется более одного индекса, ближайшего к наблюдаемому индексу во всей матрице, возьмите значение случайно (не имеет значения tbh).

  • Я имею дело с одиночной матрицей 1003x1170. Так что было бы лучше, если бы решение не было связано с такими большими накладными расходами. (необязательно)

Например, если отрицательные значения нежелательны,

[-255  4  6;
   -5 -4  5;
 -400  3  6;
   -6 -7 -8;
    3 -5  4]

становится

[4 4 6;
 4 5 5;
 3 3 6;
 3 3 6;
 3 4 4]

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

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

Спасибо за вашу поддержку!

Ответы [ 2 ]

4 голосов
/ 15 января 2020

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

Без l oop

Это создает очень большая матрица как промежуточный результат. Он может не работать для больших входов из-за ограничений памяти.

matrix = [-255 4 6; -5 -4 5; -400 3 16; -6 -7 -8; 13 -5  14];
[r_use, c_use] = find(matrix>=0); % row and column indices of useful values
z_use = r_use+1j*c_use; % same as complex number
[r_neg, c_neg] = find(matrix<0); % row and column indices of negative values
z_neg = r_neg+1j*c_neg; % same as complex number
[~, ind_min] = min(abs(bsxfun(@minus, z_use, z_neg.')), [], 1); % compute distance
    % between each useful value and each negative value. For each negative value, 
    % give  index of nearest useful value. This index is referred to r_use, c_use
ind_use = sub2ind(size(matrix), r_use(ind_min), c_use(ind_min)); % linear indices 
    % of useful values that will replace the negative values
ind_neg = sub2ind(size(matrix), r_neg, c_neg); % linear indices of negative values
matrix(ind_neg) = matrix(ind_use); % replace

До:

matrix =
  -255     4     6
    -5    -4     5
  -400     3    16
    -6    -7    -8
    13    -5    14

После:

matrix =
     4     4     6
     4     4     5
     3     3    16
    13     3    16
    13    13    14

С l oop

Это уменьшает потребление памяти, работая с отрицательными значениями по одному, используя al oop.

matrix = [-255 4 6; -5 -4 5; -400 3 16; -6 -7 -8; 13 -5  14];
[r_use, c_use] = find(matrix>=0); % row and column indices of useful values
z_use = r_use+1j*c_use; % same as complex number
[r_neg, c_neg] = find(matrix<0); % row and column indices of negative values
z_neg = r_neg+1j*c_neg; % same as complex number
for k = 1:numel(z_neg) % for each negative value
    [~, ind_min_k] = min(abs(z_use-z_neg(k))); % compute distance between
    % each useful value and this negative value. Give index of nearest
    % useful value. This index is referred to r_use, c_use
    ind_use_k = sub2ind(size(matrix), r_use(ind_min_k), c_use(ind_min_k));
    % linear index of useful value that will replace this negative value
    ind_neg_k = sub2ind(size(matrix), r_neg(k), c_neg(k)); % linear index
    % of this negative value
    matrix(ind_neg_k) = matrix(ind_use_k); % replace
end
3 голосов
/ 15 января 2020

Если у вас есть набор инструментов для обработки изображений, вы можете использовать второй вывод bwdist, чтобы найти ближайшее положительное значение индекса.

matrix = [-255  4  6;
          -5   -4  5;
          -400  3  6;
          -6   -7 -8;
           3   -5  4];
bw = matrix >= 0;
[~, idx] = bwdist(bw);

result = matrix;
result(~bw) = result(idx(~bw));

Результат будет:

result =
   4   4   6
   3   4   5
   3   3   6
   3   3   6
   3   3   4

Здесь результат вычисляется на основе расстояния евклидов . Вы можете использовать bwdist с другими метриками расстояния для получения других результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...