Изменение фона текста на уровне пикселей

Я хочу изменить изменение фона текста на уровне пикселей (используя Python). Однако я изо всех сил пытаюсь понять, какую операцию нужно выполнить для этого, учитывая значения RGB фона и значения RGB каждого текстового пикселя на белом фоне. Например, в приведенном примере изображения, как соотносятся два пикселя внутри красных квадратов? (Изображение получено путем скриншотирования текста в Microsoft Word)

Обратите внимание, что простое добавление двух масок не работает (но дает прозрачную текстуру с нечерным текстом).

PS: для того, что я хочу сделать, я не могу просто использовать PIL для этого.

Сравнение двух экземпляров текста: на белом и желтом фоне


person Noé Achache    schedule 30.01.2020    source источник
comment
Вы можете использовать OpenCV? Кроме того, на что вы хотите изменить фон?   -  person Lapis Rose    schedule 31.01.2020
comment
Можете ли вы опубликовать то, что у вас есть прямо сейчас, чтобы мы могли использовать это, а не начинать с нуля?   -  person Jongware    schedule 31.01.2020


Ответы (1)


После выполнения бленда вы можете вернуть черный цвет:

def change_background(img, color, recovery_color, intensity, recovery):
    mask = np.ones_like(img) * color
    blend = (1 - intensity) * img + intensity * mask

    # Bring back the important bits (e.g. black from img).
    # The closer the image is to the target color,
    # the stronger our recovery_mask.
    # You may need to tweak the formula.
    recovery_mask = 1 - (img - recovery_color)**recovery
    result = (1 - recovery_mask) * blend + recovery_mask * img

    return result

Использовать:

yellow = np.array([1.0, 1.0, 0.0])
black = np.array([0.0, 0.0, 0.0])
img = change_background(
    img,
    color=yellow,
    recovery_color=black,
    intensity=0.2,
    recovery=0.5
)

РЕДАКТИРОВАТЬ: я немного подумал об этом, и еще одна идея состоит в том, чтобы просто использовать черно-белое изображение напрямую в качестве маски смешивания:

def change_background(img, color, intensity):
    mask = np.ones_like(img) * color
    blend_mask = intensity * (1 - img[..., 0])
    blend = (1 - blend_mask) * img + blend_mask * mask
    return blend
person Mateen Ulhaq    schedule 31.01.2020