Warning: Undefined variable $position in /home/pystyles/pystyle.info/public_html/wp/wp-content/themes/lionblog/functions.php on line 4897

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

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

概要

OpenCV でウォーターマークを画像に追加する方法を紹介します。

Advertisement

ウォーターマーク

ウォーターマーク (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)

解説

  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となっていることを利用して、入力画像の画素値 * 1 + ウォーターマーク画像の画素値 * 透過度 で計算すると、ウォーターマーク画像の背景が0の画素は元画像の画素が残り、そうでない画素は文字と画像が合成される結果となります。

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

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

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

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() でアルファブレンドによる合成を行います。