Сделать фон изображения прозрачным или белым программно - PullRequest
3 голосов
/ 10 января 2012

Если вы создаете приложение, в котором вы хотите сделать « background » изображения прозрачным или белым, есть ли способ сделать это?

Например:

На изображении, http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg, я хотел бы программно преобразовать изображение так, чтобы осталась только статуя, а фон (т. Е. Остальная часть изображения) был полностью белым или прозрачным.

Кроме того, пользователь может указать на ту часть изображения, которая должна «остаться», а все остальное должно быть белым или прозрачным.

Как это можно сделать? Также, если есть подходящая библиотека Java или фрагмент кода, это будет полезно.

Привет

Ответы [ 2 ]

2 голосов
/ 15 января 2012

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

Вы и Миша уже обсудили первые два пункта:

  1. Обнаружение краев с использованием Canny или других средств. Я бы посоветовал вам поработать с «необработанным» изображением силы края, а не с порогом силы края, чтобы создать бинаризованное изображение. Обратите внимание, что в этом случае фигура находится в четком фокусе, и большая часть фона не в фокусе. Хотя это не общее решение, для этого конкретного изображения вы можете отфильтровать края, которые (а) принадлежат линиям (используя Hough или RANSAC), но у которых (b) есть градиенты, которые падают ниже пороговой крутизны.
  2. Наводнение. Миша уже предоставил ссылку. Флуд, заполняющий «статическое» значение, не должен быть слишком сложным для реализации (например, заполнить все соседние пиксели значения +/- N относительно пикселя, по которому щелкнули). Хорошо реализовать динамическую заливку, которая могла бы учитывать градиенты из-за освещения и трехмерной кривизны. , , ой!
  3. Среднее смещение кластеризации. Это может сработать даже в качестве первого шага, чтобы помочь объединить пиксели с одинаковыми значениями HSV. Но если взглянуть на изображение просто, оттенок фигуры на переднем плане и оттенок большей части фона похожи. OpenCV имеет реализацию среднего сдвига. На работе есть видео с соответствующим алгоритмом CAMSHIFT: http://www.youtube.com/watch?v=iBOlbs8i7Og
  4. Край, следующий за сильными краями. Если пользователь щелкает близко к краю, вы идентифицируете ближайший сильный край и затем используете алгоритм следования контуру (или «отслеживание контура»). Основные алгоритмы следования контурам работают на двоичных изображениях; Вы можете адаптировать свой алгоритм, чтобы попытаться следовать сильному краю в пространстве RGB. Tricky!
  5. Поскольку вы пишете программное обеспечение для пользователя, посвятите некоторое время его удобству, а не просто пытаетесь решить общую проблему обработки изображений.
  6. Проверка на окклюзию фоновых кривых. Другой способ определить, является ли элемент частью фона, состоит в том, чтобы определить, скрыт ли он объектом переднего плана. Если вы обнаружите два линейных сегмента, которые являются коллинеарными и имеют плавные градиенты (то есть они не в фокусе), то они могут быть двумя линейными сегментами, а не одним, потому что они закрыты объектом переднего плана.
  7. Если по какой-либо причине вы можете работать с камерой, а не с существующими изображениями, вы можете имитировать «световое поле» или пленоптическую камеру (например, Lytro https://www.lytro.com/camera), снимая несколько последовательных изображений с различными настройками фокусировки). Это может помочь вам определить фигуры на разных глубинах на основе изменений в градиентах. Если статуя находится относительно близко к камере, она будет не в фокусе, поскольку камера фокусируется к бесконечности.

Улучшение удобства использования

  1. Предполагая, что вы можете разбить изображение на фрагменты, которые достаточно различны, предложите пользователю щелкнуть по фрагментам, которые принадлежат одному и тому же интересующему объекту. Каждый блок может иметь свой собственный набор параметров настройки для прочности кромки, диапазона приемлемости для цвета и т. Д. Наличие специфичных для блока параметров может помочь сделать программное обеспечение пригодным для использования, даже если есть тени, различное освещение и т. Д., Которые представляют проблемы для сегментации. Нечто подобное можно сделать в GIMP и Photoshop, комбинируя выборки, но это менее удобно, чем могло бы быть.

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

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

Это забавная проблема.Удачи!

2 голосов
/ 11 января 2012

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

Если у вас есть время, посмотрите imageсегментация и просматривайте соответствующие статьи в Google Scholar.Вы увидите, что в общем случае это не простая задача для компьютера.В определенных случаях вы можете попытаться воспользоваться определенными условиями.На указанном вами изображении фон действительно размытый, поэтому края фигуры действительно хорошо выделяются.Обнаружение края с помощью оператора Canny дает вам следующее:

enter image description here

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

...