Существует ли правильный алгоритм определения цвета фона фигуры?
================================================================

Для колледжа нам дали задание, в котором по изображению мы должны определить «цифры», их цвет и количество «пиксельных групп» внутри них. Позволь мне объяснить:

![]()

На изображении выше есть один**фигура** (на изображении может быть несколько фигур, но давайте пока об этом забудем).

Цвет фона холста - пиксель в 0,0 (в данном случае, желтый)Цвет границы рисунка - черный (это может быть любой цвет, кроме цвета фона холста).Цвет фона рисунка - белый (он также может совпадать с цветом фона холста).Фигура может иметь только один цвет фона.На рисунке две группы пикселей. Один - это пул синих пикселей, а другой - пул красного с зеленым внутри. Как видите, не имеет значения цвет пикселей группы пикселей (он просто отличается от цвета фона рисунка). Важно то, что они находятся в контакте (даже по диагонали). Таким образом, несмотря на наличие двух разных цветов, такая группа в любом случае считается только одной.Как видите, граница может быть нерегулярной, как вы хотите. Он имеет только один цвет.Известно, что группа пикселей не будет касаться границы.Мне сказали, что цвета группы пикселей могут быть любыми, кроме цвета фона фигуры. Я предполагаю, что тогда он может быть таким же, как цвет границы фигуры (черный).Нам был дан класс, способный снимать изображения и преобразовывать их в матрицу (каждый элемент представляет собой целое число, представляющее цвет пикселя).

Вот и все. Я делаю это с Java.

**Что я сделал так далеко**

Итерация по каждому пикселю в матрицеЕсли я найду пиксель, отличный от цвета фона, я предположу, что он принадлежит границе рисунка. Я назову этот пиксель`initialPixel` впредь.Обратите внимание, что`initialPixel` на изображении, которое я указал, изображен черный пиксель в верхнем левом углу рисунка. Я специально сделал резкий разрез, чтобы проиллюстрировать это.Моя задача сейчас - найти цвет фона фигуры (в данном случае белый).Но у меня довольно много проблем, чтобы найти такой цвет фона (белый). Это самый близкий метод, который я сделал, который работал в некоторых случаях - но не с этим изображением:

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

Так как теперь я знаю цвет фона фигуры (белый), я могу попытаться перебрать каждый пиксель на фигуре, и, если я найду тот, который не принадлежит границе и не является частью фона фигуры, я уже могу сказать, что есть одна группа пикселей. Я могу начать рекурсивную функцию, чтобы найти все пиксели, связанные с такой группой, и пометить их так, чтобы в будущих итерациях я мог полностью игнорировать такие пиксели.**ЧТО МНЕ НУЖНО**

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

Мне не нужен какой-либо код - мне просто трудно придумать правильный алгоритм для такого. Тот факт, что на границе могут быть такие странные нерегулярные линии, убивает меня.

Или даже лучше: я делал все это неправильно? Может быть, я не должен был сосредоточиться на этом`initialPixel` вообще. Может быть, сработал бы другой метод? Есть ли какие-либо документы / примеры на подобные темы? Я понимаю, что есть много исследований по «компьютерному зрению» и тому подобное, но я не могу найти много об этой конкретной проблеме.

**НЕКОТОРЫЙ КОД**

Моя функция для извлечения вектора со всеми фигурами: * Примечание:`Figure` это просто класс, который содержит некоторые значения, такие как цвет фона и количество элементов.

Тогда, понятно, функция`retrieveFigure(y,x)` это то, что я не могу сделать.

**Примечания:**

В учебных целях я не должен использовать какие-либо внешние библиотеки.

[график](https://en.wikipedia.org/wiki/Graph_%28mathematics%29)где есть один узел («компонент» в этом ответе) для каждой области, заполненной цветом.

Вот один из способов реализации этого подхода:

Пометить все пиксели как не посещенные.Для каждого пикселя, если он не посещен, выполните[заливка](https://en.wikipedia.org/wiki/Flood_fill) алгоритм на нем. Во время заливки отметьте каждый подключенный пиксель как посещенный.

Теперь у вас должен быть список областей сплошного цвета на вашем изображении (или «компонентах»), так что вам просто нужно выяснить, как они связаны друг с другом:

Найдите компонент, пиксели которого расположены рядом с компонентом цвета фона - это граница вашей фигуры. Обратите внимание, что вы можете найти компонент цвета фона, найдя компонент с 0,0 пикселем.

Теперь найдите компоненты с пикселями, смежными с недавно найденным компонентом 'figure border'. Таких компонентов будет два - выберите тот, который не является фоном (то есть не имеет 0,0 пикселя). Это фон вашей фигуры.

Чтобы найти группы пикселей, просто посчитайте количество компонентов с пикселями, смежными с компонентом фона рисунка (игнорируя, конечно, компонент границы рисунка)

Преимущества этого подхода:

работает в O (# пикселей) времени.легко понять и реализовать.не предполагает, что цвет фона и цвет фона рисунка отличаются.Чтобы убедиться, что вы понимаете, как могут работать итерации компонентов и их соседей, вот пример реализации псевдокода для шага 5:



Попробуйте этот код:

возвращенный цвет - формат ARGB. Вам нужно будет извлечь R, G и B из него.

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