OpenCV – 画像に透かし文字 (watermark) を入れる方法

目次

概要

OpenCV で透かし文字 (watermark) を画像に追加する方法を紹介します。

ウォーターマーク

ウォーターマーク (watermark) とは、著作権表示などの目的で画像に埋め込まれる文字または図形のことをいいます。

ウォーターマーク画像を合成する

ウォーターマークは黒い背景に白い文字が書かれた画像を使用します。

sample.jpg

入力画像

watermark.jpg

ウォーターマーク画像

In [1]:
import cv2
import numpy as np
from IPython.display import Image, display


def imshow(img):
    """ndarray 配列をインラインで Notebook 上に表示する。"""
    ret, encoded = cv2.imencode(".png", img)
    display(Image(encoded))


img = cv2.imread("sample.jpg")  # 入力画像
mark = cv2.imread("watermark.jpg")  # ウォーターマーク画像

x, y = 50, 50  # ウォーターマーク画像の貼り付け位置
roi = np.s_[y : y + mark.shape[0], x : x + mark.shape[1]]  # 編集する領域

# アルファブレンドを行う。
img[roi] = cv2.addWeighted(img[roi], 1, mark, 0.3, 0)

imshow(img)
(slice(50, 161, None), slice(50, 371, None))

解説

  1. ウォーターマークを合成する領域 (region of interest, ROI) を表すスライスオブジェクトを作成します。

    roi = np.s_[y : y + mark.shape[0], x : x + mark.shape[1]]
  2. cv2.addWeighted() でアルファブレンドによる合成を行います。

    img[roi] = cv2.addWeighted(img[roi], 1, mark, 0.3, 0)

ウォーターマーク画像は、背景部分の画素値が 0 になっていることを利用します。これを用いて、次のように計算することでウォーターマークを合成します。

$$ 入力画像の画素値 \times 1 + ウォーターマーク画像の画素値 \times 透過度 $$

この計算により、ウォーターマーク画像の背景が 0 の画素は元の画像の画素が残り、背景が 0 でない画素には文字と画像が合成される結果となります。

cv2.putText() で文字を入れる

ウォーターマーク画像を用意する代わりに cv2.putText() で画像に直接文字を入れる例を紹介します。

In [2]:
import cv2
import numpy as np

img = cv2.imread("sample.jpg")

# 黒い画像を作成する。
mark = np.zeros_like(img)

# 白い文字を描画する。
cv2.putText(
    mark,
    "Watermark",
    (50, 200),
    fontFace=cv2.FONT_HERSHEY_SIMPLEX,
    fontScale=2.0,
    color=(255, 255, 255),
    thickness=5,
    lineType=cv2.LINE_AA,
)

# アルファブレンドを行う。
img = cv2.addWeighted(img, 1, mark, 0.3, 0)


imshow(img)

解説

  1. 入力画像を同じ大きさの黒い画像を作成します。
  2. 黒い画像に cv2.putText()color=(255, 255, 255) で白い文字を描画します。
  3. cv2.addWeighted() でアルファブレンドによる合成を行います。

コメント

コメントする

目次