Текущее состояние
- У меня есть массив массивов
(900, 1800, 3)
, созданный из файла изображения. - Это один элемент массива на пиксель: высота 900 пикселей, ширина 1800 пикселей и 3 канала (R, G, B) на пиксель, представленный в массиве.
- Есть только небольшое число(3-20) уникальные цвета RGB в анализируемых изображениях, поэтому в массиве представлено очень мало различных комбинаций значений RGB.
Цель
- Определите самые маленькие круглые области на изображении, которые содержат
n
количество уникальных цветов, где n
всегда будет меньше или равно количеству уникальных цветов на изображении. - Возвратtop
y
(по количеству или pct) наименьших областей. - "Результатом" может быть просто значение x, y центрального пикселя идентифицированной круговой области и его радиус.
- I do планирую нарисовать круг вокруг каждой области, но этот вопрос касается наилучшего подхода для первого определения наименьших верхних областей.
The Catch / Caveat
Изображения на самом деле являются сплюснутыми проекциями сфер.Это означает, что пиксель на правом краю изображения фактически смежен с пикселем на левом краю, и аналогично для верхнего и нижнего пикселей.Решение должно учитывать это, поскольку оно анализирует пиксели для идентификации ближайших пикселей с другими цветами. РЕДАКТИРОВАТЬ: эта часть может быть дан ответ в комментариях ниже
Вопрос
Мой первоначальный подход заключается в простом разборе пикселя за пикселем и грубой силепроблема с управляемой математикой координат x / y: возьмите пиксель, работайте наружу, пока мы не достигнем n
цветов, отметьте этот пиксель за количество шагов, которое потребовалось наружу, следующий пиксель.Держите верхний y
диктант, который переоценивается после каждого пикселя, добавляя любые пиксели, которые составляют верхний y
, и сбрасывая любые, которые выталкиваются.Верните этот dict в качестве вывода.
Я знаю, что многим библиотекам Python, таким как scipy
, scikit-image
, и, возможно, другим нравится работать с изображениями в виде массивов.Я уверен есть метод / подход, который умнее и использует библиотеку или какой-либо кластеризованный алгоритм вместо грубого форсирования, но я недостаточно знаком с пространством, чтобы интуитивно знать, какие методыи libs, чтобы рассмотреть.Вопрос: Что такое псевдокод для хорошего метода / lib, чтобы сделать это правильно?