Как убрать белые аннотации с изображения? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь удалить белые аннотации этого изображения (цифры и стрелки), а также черную сетку с помощью MATLAB:

raw image

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

Как я могу получить изображение, подобное этому?

result image

Спасибо, что уделили время.

1 Ответ

0 голосов
/ 25 января 2019

Общее название для такой задачи - написание. Если вы ищете это, вы найдете лучшие методы, чем то, что я показываю здесь. Это не более чем подтверждение концепции. Я использую DIPimage 3 (потому что я автор, и мне легко пользоваться).

Сначала нам нужно создать маску для областей, которые мы хотим удалить (inpaint). Легко найти пиксели, в которых все три канала имеют высокое значение (белый) или низкое значение (черный):

img = readim('https://i.stack.imgur.com/16r9N.png');

% Find a mask for the areas to remove
whitemask = min(img,'tensor') > 50;
blackmask = max(img,'tensor') < 30;
mask = whitemask | blackmask;

Эта маска не охватывает всю черную сетку, если мы увеличим порог, мы также удалим темную область моря у побережья Испании. И это также отражает белый контур побережья. Мы можем сделать это немного лучше с помощью дополнительной фильтрации:

% Find a mask for the areas to remove
whitemask = min(img,'tensor') > 50;
whitemask = whitemask - pathopening(whitemask,50);
blackmask = max(img,'tensor');
blackmask2 = blackmask < 80;
blackmask2 = blackmask2 - areaopening(blackmask2,6);
blackmask = blackmask < 30 | blackmask2;
mask = whitemask | blackmask;

Создает следующую маску:

mask

Все еще далеко от совершенства, но хорошее начало для нашего доказательства концепции.

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

% Solution 1: normalized convolution
smooth = gaussf(img * ~mask, 2) / gaussf(~mask, 2);
img(mask) = smooth(mask);

output for solution 1

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

% Solution 2: morphology
smooth = iterate('closing',img * ~mask, 13);
img(mask) = smooth(mask);

output for solution 2

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