Метод замены цвета пикселя ближайшим цветом пикселя, который не является самим собой

Например, скажем, это ввод:

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

Вот пример того, что я имею в виду:

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

Поэтому вместо этого я ищу, существует ли альтернативный процесс для достижения того же результата, существует ли какая-либо техника обработки изображений для достижения того или иного метода.

запахи, похожие на дистанционное преобразование, могут быть полезными в решении. это будет работать лучше всего, если ваше изображение содержит умеренное количество разных цветов (палитры).

Christoph Rackwitz 25.04.2024 12:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
123
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Эта проблема требует, чтобы вы думали о ней, не прибегая к «готовому» стандартному алгоритму, названному в честь кого-то, кого можно найти в книгах — я бы попробовал найти середину каждого пятна и по спирали от него — если расположить спиральные циклы в пространстве, вы заключите регионы, которые должны иметь одних и тех же соседей.

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

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

Вам не придется думать о подходе и писать его код. (никто здесь не будет писать за вас код с нуля. Если у вас есть алгоритм, который вы не можете поместить в код, то вы можете поместить весь код, который у вас есть - этот код должен быть минимальным воспроизводимым примером: поскольку это «Python» включает в себя инструкции импорта, вызовы чтения файлов для получения целевого изображения и вызов вашей функции, чтобы люди могли возиться с вашим кодом и предлагать исправления.

Простая реализация BFS будет иметь наихудшее квадратичное время выполнения по количеству пикселей, но вы можете достичь желаемого результата с линейной сложностью. Просто переберите все пиксели и поместите пиксели с соседями разного цвета в очередь. Затем пройдите по очереди и соответствующим образом измените цвет и добавьте в конец очереди соседние пиксели того же цвета. Вам понадобится вторая матрица, чтобы запомнить, какие пиксели уже были добавлены в очередь, чтобы избежать двойной смены пикселя. Как только очередь станет пустой, все пиксели будут изменены.

Обратите внимание, что в зависимости от того, как вы определяете соседний пиксель, ваш результирующий «ближайший пиксель» будет меняться: если вы используете 4-связных соседа, каждый пиксель заменяется ближайшим соседом L1 другого цвета. Если вам нужны ближайшие соседи L2, вам понадобится приоритетная очередь, основанная на расстоянии, и увеличивайте размер района, с которым вы работаете, на каждом этапе.

Использование генеративного искусственного интеллекта (например, ChatGPT) запрещено в Stackoverflow. Пожалуйста, ознакомьтесь с политикой Stackoverflow в отношении использования gpt чата: Meta.stackoverflow.com/questions/421831/… .

Luciana Oliveira 30.04.2024 19:33

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

Я могу предложить два подхода:

  1. предполагая палитру цветов
  2. если предположить, что нет палитры

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

Это сообщает вам, из любой позиции пикселя, расстояние до любого желаемого цвета в палитре.

Для какого-либо пикселя, который вы хотите заменить, найдите его местоположение во всех полях расстояний и определите тот, который дает второе наименьшее расстояние. Первое наименьшее расстояние — это расстояние его собственного цвета, которое должно быть равно 0. Второе наименьшее расстояние обязательно должно быть больше 0.


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


Другой подход — выполнить эту работу заново для каждого пикселя, который вы хотите изменить. Вычислить маску для цветов, отличных от текущего пикселя. Найдите ближайший пиксель, помеченный как «истина». Преобразование расстояния может сообщить вам расстояние до него (значительно сокращая пространство поиска), а в некоторых реализациях оно может даже указать направление к нему.

Другие вопросы по теме