Как удалить фон без потери информации?

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

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

Пример 1
5d5bb1578264a461945358.png
Пример 1 (увеличенный)
5d5bb15f8c88b165844757.png
Пример 2 (без картинки): красный мячик на траве.

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

Сложность ещё и в том, что ширина перехода предмета в фон (ширина размытия) может быть больше одного пикселя. Но инструмент должен как-то догадаться, что очень мелкие примеси - это уже начало границы с объектом.
  • Вопрос задан
  • 4990 просмотров
Решения вопроса 4
Задача довольно частая, поэтому к ней есть множество решений и подходов. И специализированные инструменты в редакторах и плагины. Одной из трудных считается задача отделить волосы/шерсть от сложного фона. И тоже решается.

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

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

Рассмотрите каждый из каналов, R, G и B – где наиболее контрастно выглядит разница между объектом и фоном?
В данном случае это в канале красного, R. Возьмём его за основу для будущей маски.

Скопируйте его, и Уровнями поднимите контраст, глядя на гистограмму, чтобы от чёрного до белого были пиксели. Потом инвертируйте маску и примените к слою с исходной картинкой.
результат
5d5bb9c49e101149369921.png
Ответ написан
irishmann
@irishmann
Научись пользоваться дебаггером
Gimp. Добавить альфа-канал для слоя, в меню "Цвет" выбрать "Цвет в альфа канал".
Результаты:

Итоговый png:
5d5bd29a94a61206765226.png
На разных фонах:
5d5bd4bac3e44663912841.png
Ответ написан
@rPman
Вам сняло надо избавиться от градиенты, простые способы, например считайте производную яркости по каждому каналу, не обязательно rgb, лучше предлагать в cmyk или hsv... Или пример, замыльте изображение с большим шагом, таким, чтобы объекты на итоговом изображении исчезли и осталась только общая градиента. Затем высчтете из исходного изображения это замыленное ( лучше использовать деление). В итоге вы избавитесь от градиенты и бонусом получите доп выделение границ. Этот метод идеален например при получении скана бумаги с текстом при неравномерном освещении.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Выровнить яркость всех пикселей.
2. Уменьшить (обеднить) цветовую палитру (color reduce).
3. Избавиться от градиентов через модульную разницу по каждому каналу (RGB: 3x3).
п.4 и п.5
4. Найти контур (для примеров из текста вопроса этот пункт не нужен)
5. Определить области внутри всех контуров (для примеров из текста вопроса этот пункт не нужен)
6. Удалить области с нужным цветом на начальном изображении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы