устранение шума в алгоритме обнаружения краев - PullRequest
1 голос
/ 04 мая 2010

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

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

Данные содержат два типа шума. Первый тип довольно редкий и несколько случайный. Второй тип - полунепрерывная прямая на оси x = y. Я знаю источник первого типа шума, его особенности данных, и я ничего не могу с этим поделать. Что касается второго типа, я знаю, что это ошибка моей программы в том, что она была вызвана ... хотя я не имею понятия, что именно вызывает ее.

Мой вопрос: Как мне полностью удалить шум?

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

Однако, второй тип шума, где мы имеем полунепрерывную линию около x = y, представляет большую проблему. Линия иногда непрерывна для случайных длин (самая длинная была, если она прошла половину всего моего массива без разрывов). Для него даже возможно пересечь фактическое ребро.

Есть идеи, как это сделать?

Ответы [ 3 ]

3 голосов
/ 04 мая 2010

Обычно при обработке изображения медианный фильтр.

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

2 голосов
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

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

...