Я недавно написал чрезвычайно простой алгоритм обнаружения ребер, который работает с массивом символов. Программа предназначалась для обнаружения краев больших двоичных объектов одного конкретного значения в массиве и работала, просто просматривая элемент массива влево, вправо, вверх и вниз и проверяя, не совпадает ли одно из этих значений со значением, которым оно было сейчас смотрю. Цель состояла не в том, чтобы создать математическую линию, а в наборе упорядоченных точек, представляющих дескритизированный край замкнутого контура.
Алгоритм работает отлично, за исключением того, что мои данные содержали немного шума и, следовательно, могли бы случайным образом создавать ребра там, где не должно быть ребер. Это, в свою очередь, привело к хаосу в некоторых других моих программах.
Данные содержат два типа шума. Первый тип довольно редкий и несколько случайный. Второй тип - полунепрерывная прямая на оси x = y. Я знаю источник первого типа шума, его особенности данных, и я ничего не могу с этим поделать. Что касается второго типа, я знаю, что это ошибка моей программы в том, что она была вызвана ... хотя я не имею понятия, что именно вызывает ее.
Мой вопрос:
Как мне полностью удалить шум?
Я знаю, что правильные данные имеют точки, которые всегда находятся рядом друг с другом, очень компактны и упорядочены (без пробелов) и представляют собой замкнутый цикл или несколько циклов. Первый тип шума обычно является редким и случайным, о котором можно легко позаботиться, проверив, находится ли какой-либо край рядом с тем, что точка шума также считается как край. Если нет, то точка является наиболее вызывающим шумом и должна быть удалена.
Однако, второй тип шума, где мы имеем полунепрерывную линию около x = y, представляет большую проблему. Линия иногда непрерывна для случайных длин (самая длинная была, если она прошла половину всего моего массива без разрывов). Для него даже возможно пересечь фактическое ребро.
Есть идеи, как это сделать?