Matlab матричное обрезание кластеров - PullRequest
1 голос
/ 08 декабря 2011

Учитывая матрицу:

0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0
0 0 1 1 0 1 0 1
0 0 1 1 0 1 0 0
0 0 0 0 1 0 0 0

обратите внимание, что 1 в основном сгруппированы, за исключением 1 в 3-й строке, последний столбец

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

0 1 1 1 
1 1 0 1
1 1 0 1
0 0 1 0

вышеупомянутая культура - самая маленькая прямоугольная культура, которую я могу сделать, чтобы покрыть наибольшее количество единиц.

Проблема, с которой я столкнулся сейчас, заключается в том, как сделать это в Matlab? Я не могу просто снять все 0, и я должен следить за выбросами 1. Каков наиболее эффективный метод решения этой проблемы?

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

1 Ответ

3 голосов
/ 08 декабря 2011

То, что вы пытаетесь сделать, эквивалентно маркировке двухмерных связанных компонентов в двоичном изображении. Если у вас есть доступ к панели инструментов обработки изображений, функция будет bwlabel: http://www.mathworks.com/help/toolbox/images/ref/bwlabel.html

Если у вас нет доступа к bwlabel, существует несколько алгоритмов. Самый быстрый из известных мне - тот, который использует OpenCV, который находит замкнутые контуры на изображении и основан на

F. Chang, C.-J. Чен и С.-Дж. Лу, «Маркировка компонентов с линейным временем алгоритм, использующий технику контурной трассировки », Computer Vision and Image Понимание, вып. 93, нет. 2, с. 206–220, 2004

...