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

概要
OpenCV でウォーターマークを画像に追加する方法を紹介します。
Advertisement
ウォーターマーク
ウォーターマーク (watermark) とは、著作権表示などの目的で画像に埋め込まれる文字または図形のことをいいます。
ウォーターマーク画像を合成する
ウォーターマークは黒い背景に白い文字が書かれた画像を使用します。
入力画像
ウォーターマーク画像
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)

解説
- ウォーターマークを合成する領域 (region of interest, ROI) を表すスライスオブジェクトを作成します。
roi = np.s_[y : y + mark.shape[0], x : x + mark.shape[1]]
cv2.addWeighted()
でアルファブレンドによる合成を行います。
ウォーターマーク画像は背景部分の画素値は0となっていることを利用して、img[roi] = cv2.addWeighted(img[roi], 1, mark, 0.3, 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)

解説
- 入力画像を同じ大きさの黒い画像を作成します。
- 黒い画像に
cv2.putText()
でcolor=(255, 255, 255)
で白い文字を描画します。 cv2.addWeighted()
でアルファブレンドによる合成を行います。
-
前の記事
OpenCV – cv2.pointPolygonTest でポリゴンの中に点が含まれるかどうか調べる 2020.09.05
-
次の記事
OpenCV/Pillow – 画像を base64 形式に変換する方法 2020.09.29