Вы не сможете сделать это автоматически со 100% точностью.
Причина этого в том, что единственная информация, которая у вас есть, - это цвет, о котором вы знаете, что некоторые пиксели на изображении пытаются красиво смешаться. Только некоторые пиксели в изображении будут фактически использовать цвета на или близко к этому значению для целей затенения на заднем плане, другие будут использовать (в случае белый), потому что фактически представленный объект на самом деле белый (чертовски точно эти имперские штурмовики).
Это сложное машинное обучение для обнаружения, которое представляет собой интересную проблемную область и может быть интересным проектом для вас, но оно, безусловно, не поможет быстро решить вашу непосредственную проблему.
Другая проблема, с которой вы столкнулись, заключается в том, что даже если вы сможете с высокой степенью достоверности обнаружить те области изображения, которые пытаются смешаться с фоном, у вас возникнут проблемы с их «разглаживанием», а затем с повторным смешиванием в новый цвет фона если цвета не являются разумно совместимыми. В этом случае ваш серый может работать, так как это широкий спектр цветов, как белый.
Техника, которую вы хотите использовать, выглядит следующим образом:
- Используйте алгоритм заливки, чтобы выбрать по краям изображения все пиксели в пределах x% (1) от известного цвета фона.
- Для этих пикселей установите для их альфа-канала значение, соответствующее пропорции их соответствия исходному цвету, и устраните цветовой оттенок, который был с ним связан.
- Таким образом, если фон имеет значение RGB a, b, c, а пиксель равен a + 5, b, c-7, то результат
RGBA 5,0,0, ((a + b + c-7) / (a + b + c) * 256) (1)
- Скомбинируйте это альфа-смешение с квадратом боли нового заднего фона.
- отображает результат без альфа-канала в качестве нового изображения.
Это по-прежнему будет иметь проблемы для объектов, цвет которых близок к любому из цветов фона.
* в случае с оригиналом, возможно, затенение используется для обозначения присутствия объекта, так как заливка будет «проникать» внутрь изображения.
* в случае последнего полученное изображение потеряет определение объекта, и не будет присутствовать тонкое затенение, выделение или просто простые линии, указывающие, где заканчивается объект и заканчивается фон.
Это очень грубое первое приближение, но оно может покрывать разумный процент от вашей цели. Те изображения с прозрачными полностью закрытыми отверстиями (как, например, промежутки во внешней арке в вашем примере) вряд ли когда-нибудь будут работать в автоматическом режиме, поскольку алгоритм не сможет отличить белые дыры от белых штурмовиков.
Возможно, вы захотите заставить свой алгоритм выделить области изображения, которые он планирует переименовать, и разрешить простой выбор областей для включения / исключения (используя инструмент выбора волшебной палочки из Pain.Net в качестве примера того, как это сделать, если вы хотите чтобы быть модным, позволяя простой выбор за пиксель для меньших предварительных усилий.
- значение для x будет тем, что вы настраиваете - возможно, из-за некоторых аспектов изображения (например, пропорции изображения, близкого к фоновому цвету) вы можете настроить его автоматически.
- Обратите внимание, что эта формула принимает цвет, близкий к белому, для цвета, близкого к черному, вы хотите инвертировать