5

У меня есть этот образ:Удаление нежелательных символов в органической схеме молекулы

enter image description here

Я хочу, чтобы удалить все части изображения, которые не являются частью органической структуры молекулы. Поэтому в этом конкретном изображении я хочу удалить Process A и line below it. Я попытался использовать bwlabel для подключения компонентов, но сама структура не образует один компонент. Таким образом, удаление этим методом невозможно. Любая идея, как я могу решить эту проблему?

+0

Вопрос может звучать глупо, но в чем разница между частями, которые вы хотите, и теми частями, которые вам не нужны? Оба являются линиями и символами. Может быть, обнаружить вертикальный зазор (использовать сумму строк) и разделить там? Может быть, использовать imerode для подключения обеих черных областей, а затем сегментировать с bwlabel? – Daniel

ответ

8

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

Метод # 1 - Использование bwareaopen

дешевый способ сделать это было бы, чтобы инвертировать изображение таким образом, чтобы объект пикселей белый вместо черного, затем выполняет морфологическое закрытие на изображении и удаления этих областей, подпадают под определенную сумму. Закрытие объединяет объединенные регионы и использует преимущества того, что присоединение к «структуре» приведет к созданию региона с большой площадью, вы можете порождать область каждого региона и исключать те регионы, которые опускаются ниже определенной суммы.

Вы можете вернуть исходное изображение, просто выполнив логический AND с инвертированным изображением и закрытым результатом, а затем переустановив этот промежуточный результат. Эффект этого заключается в том, что мы сохраняем только пиксели, принадлежащие исходному изображению, из-за операции закрытия, искусственно создающей пиксели объекта. В частности, объединение соседних областей структуры создало бы новые пиксели объекта, и поэтому выполнение AND обеспечит удаление этих пикселей, не совпадающих с оригиналом. Поскольку это выполняется на обратной стороне исходного результата, повторное преобразование возвращает вас к исходному домену пикселей объекта, являющемуся черным, а не белым.

Что-то вроде этого:

%// Read in image from StackOverflow 
im = imread('http://i.stack.imgur.com/A7iT7.png'); 

%// Invert image 
im = ~im; 

%// Define 50 x 50 structuring element and close the image 
se = strel('square', 50); 
out = imclose(im, se); 

%// Remove regions whose areas fall below 10000 pixels 
out = bwareaopen(out, 10000); 

%// Remove out extraneous closing areas by ANDing with inverted image 
%// then reinvert to bring back to original label scheme 
out = ~(im & out); 

%// Show the image 
imshow(out); 

Мы получаем этот образ:

enter image description here

Примечание

  1. Функции imclose будет выполнять морфологическое закрытие для вас с помощью структурного элемента определяемый strel. Я использовал квадрат 50 x 50, чтобы убедиться, что у нас есть достаточно большое окно для объединения соседних пикселей объекта.
  2. Функция bwareaopen принимает двоичное изображение и удаляет области, пиксельные области которых находятся ниже определенной величины. После закрытия вы будете иметь две связанные области - верхнюю часть изображения со структурой и нижней частью с текстом. По экспериментам 10000 пикселей удалили область внизу. Метод

# 2 - Использование regionprops

, относящиеся к методу # 1, альтернативный способ сделать это и быть порог агностик пойти с вашей оригинальной идеей. Сделайте операцию закрытия, но затем оцените области каждой из подключенных областей и выберите ту, которая имеет наибольшую площадь. В этом случае я рекомендую использовать regionprops, что является функцией, которая специально предназначена для анализа характеристик отдельных областей изображения. Результатом будет структура элементов N, где N - общее количество уникальных и связанных объектов, найденных на изображении, и каждая структура содержит поля свойств, которые вы хотите измерить на изображении. В вашем случае укажите атрибуты 'Area' и 'PixelIdxList', которые содержат области и основные пиксельные местоположения пикселей каждого региона.

Вы найдете максимальную площадь в целом и используете соответствующие пиксельные местоположения и задаете карту вывода, которую вы бы логили AND.

Что-то вроде этого:

%// Read in image from StackOverflow 
im = imread('http://i.stack.imgur.com/A7iT7.png'); 

%// Invert image 
im = ~im; 

%// Define 50 x 50 structuring element and close the image 
se = strel('square', 50); 
out = imclose(im, se); 

s = regionprops(out, 'Area', 'PixelIdxList'); %// Apply regionprops 

%// Find the region with the max area 
[~,id] = max([s.Area]); 

%// Create an output mask with the largest area 
%// Make logical 
out = false(size(im)); 

%// Set pixels from largest area 
out(s(id).PixelIdxList) = true; 

%// Rest of the logic from before 
%// Remove out extraneous closing areas by ANDing with inverted image 
%// then reinvert to bring back to original label scheme 
out = ~(im & out); 

%// Show the image 
imshow(out); 

Вы должны получить те же результаты, что и первый метод.

+0

Большое спасибо. У меня все еще есть вопрос.By bwareapen вы удаляете области с пиксельными областями ниже 1000. Есть ли способ, которым я могу найти пиксельные области каждого региона после закрытия операции. Это потому, что в большинстве случаев мне требуется только самая большая связанная область, поэтому, если бы я мог получить пиксельные области в каждой связанной области, я мог бы просто взять тот, у которого наибольшая площадь – Noober

+1

А, да, вы можете. Дайте мне немного изменить свой ответ. Честно говоря, ваша идея была другой, которую я рассматривал, но я хотел быстро ответить вам. – rayryeng

+0

На самом деле я попытался использовать 'bwlabel' после операции' закрытия', чтобы получить подключенный компонент. Используя первый подключенный компонент, я получил свое исходное изображение, выполнив логический 'AND'. Это приводит к правильному результату. Но я не думаю, что каждый раз, когда первый компонент будет иметь самую большую область. Вот почему я хотел получить области каждого региона. – Noober

1

После предположения, что название изображения разделено в пространстве от «фактического изображения» достаточно далеко:

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

  1. Фильтр Gauss/Median (при необходимости) и обнаружение края.
  2. бинаризация
  3. Морфологические операции (эрозия, дилатация)
  4. Blob Экстракция эвристика (размер/форма/положение).

в то время как 4. является заменой подключенных компонентов (что необязательно). Вы можете искать другие методы под ключевым словом blob extraction или text extraction. Это грубая схема того, что вы будете делать «в общем случае». Какие шаги приносят наилучшее решение, это зависит от ваших данных, поэтому вам придется немного поэкспериментировать.

Смежные вопросы