Есть ли адаптация к алгоритму Марширующих квадратов, чтобы сделать сжатие без потерь для ограниченных входных данных? - PullRequest
0 голосов
/ 13 февраля 2019

Я использую алгоритм Марширующие квадраты , чтобы взять решетку значений и превратить их в контур, когда значения превышают 50%.Мои значения имеют свойство, которое в большинстве случаев составляет 0% и 100%, когда переходы от 0% до 100% происходят не более чем для одного промежуточного значения, так что созданный контур будет проходить через каждую позицию решетки, где значение больше 0%.и менее 100%.Например, рассмотрим это поле значений, представляющих приблизительные проценты, показанные в полутоновых квадратах следующего изображения:

0   0   0   0   0   0   0   0
0   0   6  71  71  20   0   0
0  28  35 100 100  48  20   0
0 100 100 100 100 100  71   0
0 100 100 100 100 100  71   0
0   9  18 100 100  35   6   0
0   0   9 100 100  28   0   0
0   0   0   0   0   0   0   0

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

enter image description here

Голубое поле представляет контур, а квадраты серой шкалы представляют значения решетки для вышеуказанных данных.

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

enter image description here

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

0   0   0   0   0   0   0   0
0   0   3  67  70   4   0   0
0  12  43 100 100  59   4   0
0  91 100 100 100 100  70   0
0  88 100 100 100 100  67   0
0   4  27 100 100  43   3   0
0   0   3  88  91  12   0   0
0   0   0   0   0   0   0   0

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

В правой нижней части примера один шаг алгоритма марширующих шагов находит следующие четыре значения:

100  28
  0   0

В результате интерполяции получается 50% налевая сторона и 70% на верхней стороне.Это означает, что слева точка A расположена точно на границе между квадратом 0% в левом нижнем углу и квадратом 100% в верхнем левом углу.Это означает, что сверху точка Т находится на 70% пути к центру значения 28% в правом верхнем углу.Вышеизложенное приводит к диагональной линии от A до B, занимающей верхний левый угол со значением 100.

Мы можем добавить дополнительные промежуточные точки между A и B, чтобы значения области не терялись при возврате назад (декомпрессия)) от контура до значений решетки.Например, рассмотрим этот рисунок:

enter image description here

Исходные марширующие квадраты дают точки A и B на чертеже.Желтое выделение показывает дополнительные точки X, Y и Z, которые можно добавить так, чтобы покрытая область составляла 100% в левом верхнем углу, 0% в левом нижнем углу и 28% в верхнем правом углу.Для 28% 14% обрабатывается ниже точки B и 14% выше точки B.

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

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

...