iMind Developers Blog

iMind開発者ブログ

PillowとOpenCVで画像にテキストを追加する

概要

Pillowで画像を読み込んでテキストを表示する。ついでにOpenCVでも同じことをしてみる。

バージョン情報

  • Pillow==6.0.0
  • opencv-python==4.1.0.25

Pillowで画像の読み込みと表示

単純に画像を読み込んで表示だけするコード。

%matplotlib inline

import PIL
from matplotlib import pylab as plt

# 画像の読み込みと表示
img = PIL.Image.open('sample.jpg')
plt.imshow(img)

f:id:mwsoft:20190803194102p:plain

後ろ足かわいい

フォントの確認

テキスト表示をする際に利用するフォントを確認する。

利用可能なフォントを表示するコード。

import matplotlib.font_manager
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')

当方の環境はUbuntuなので、表示された中からNotoのBoldを使ってみることにする。

'/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc',

Pillowでテキストの追加

フォントを指定してテキストを画像に追加する。

from  PIL import ImageDraw, ImageFont

# フォントの指定
font = ImageFont.truetype("NotoSerifCJK-Bold.ttc", 96)

# 編集用に画像をコピー
new_img = img.copy()

# コピーした画像にテキストを追加してplot
draw = ImageDraw.Draw(new_img)
draw.text((20, 50), "dog", (255, 0, 0), font=font)
plt.imshow(new_img)

draw.textに指定している引数は順に, 座標, 表示するテキスト, 色, フォント。

実行結果

f:id:mwsoft:20190803194304p:plain

OpenCVで画像の読み込みと表示

OpenCVでもやってみる。

まずは画像の読み込みと表示。

import cv2
img = cv2.imread('sample.jpg')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

OpenCVでテキストの追加

フォントを指定してテキストを画像に追加する。OpenCVの場合、RGBではなくBGRになるので赤は(0, 0, 255)になる。

new_img = img.copy()
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(new_img, 'dog', (20, 200), font, 3, (0, 0, 255), 5)
plt.imshow(cv2.cvtColor(new_img, cv2.COLOR_BGR2RGB))

f:id:mwsoft:20190803194651p:plain

putTextの引数は順に、img, text, bottom_leftの座標, font_face, font_scale, color, thickness。

fontで指定できる定数は下記を参照。

OpenCV: Drawing Functions

上記で指定したフォントだと日本語を表示しようとすると文字化けする。

freetypeを使えばOpenCVでもフォント指定が可能なようだけど、Pillowの方が楽なので割愛。

コード全文

https://github.com/imind-inc/blog/blob/master/notebook/pillow/add_text.ipynb

改定履歴

Author: Masato Watanabe, Date: 2019-08-03, 記事投稿