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

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

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

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

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

Сложность ещё и в том, что ширина перехода предмета в фон (ширина размытия) может быть больше одного пикселя. Но инструмент должен как-то догадаться, что очень мелкие примеси - это уже начало границы с объектом.
  • Вопрос задан
  • 4953 просмотра
Решения вопроса 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. Удалить области с нужным цветом на начальном изображении.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Ремарк Тюмень
от 30 000 руб.
Spice IT Recruitment Москва
До 180 000 руб.
Bash Today Москва
от 100 000 до 140 000 руб.