Изменение фона текста на уровне пикселей - PullRequest
0 голосов
/ 31 января 2020

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

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

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

Two text instances compared: on white and yellow background

1 Ответ

0 голосов
/ 31 января 2020

После выполнения смешивания вы можете вернуть черных:

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
...