Pythonで画像の処理をするには外部ライブラリのOpenCVを利用すればよく、その基本的な画像処理の方法も学びました。
これで画像ファイルを開いてサイズの変更や画像の反転などができるようになった訳ですが、さらに線や図を描けることもできます。
ここではOpenCVを使って画像に線や図を描画する方法を学んで行こうと思います。
図形を描く
OpenCVで図を描いて行きましょう。
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
cv2、numpy、matplotlibをインポートします。
img_areaとして、np.zeros()を使って図のエリアを作ってみます。
img_area = np.zeros(shape=(500,500,3),dtype=np.int16)
shapeに縦が500、横が500、3カラーチャンネルを指定しています。zeros()は0行列なので値は全てゼロとなります。
img_area.shape
plt.imshow(img_area)
shapeで行列の型の確認と図を表示してみます。
500行500列、3カラーチャンネルの図が表示されました。データはゼロですから黒色になっています。
このエリアに色々と形を描いていきますが、ここで図の位置について確認しておきます。
コンピューターの図の各座標の位置は画面の左上が原点の(0, 0)になり、x軸はそこから右へ、y軸はそこから下に伸びることで座標を示します。数学などの座標と違うので注意しましょう。
矩形:rectangle()
まず、矩形(rectangle)を適当な位置に表示してみましょう。
矩形を描くにはcv2.rectangle()を使います。
cv2.rectangle(img_area, pt1=(10,10), pt2=(120,120), color=(0,255,0), thickness=5)
rectangle()にimg_areaのデータを渡します。矩形のpt1は左上の座標、pt2は右下の座標です。pt1、pt2を省略してタプルだけを渡しても構いません。ここでは色を緑に指定しています。thicknessは厚み(線の太さ)です。
plt.imshow(img_area)
画像を表示してみましょう。
緑色で矩形が表示されています。座標の左上、右下の位置が指定の場所になっていることがわかりますね。
もう1つ違う位置に青色で矩形を描いてみます。
cv2.rectangle(img_area, pt1=(200,200), pt2=(300,300), color=(0,0,255), thickness=5)
plt.imshow(img_area)
最初に描いた図に追加される形で表示されます。
円:circle()
次は円(circle)を描いてみます。
矩形を描くにはcv2.circle()を使います。
cv2.circle(img=img_area, center=(300,300), radius=60, color=(255,0,0), thickness=5)
plt.imshow(img_area)
使い方は矩形と同じで、座標はcenterで中心を、radiusで円の半径を与えます。ここでは色を赤にしてみます。
塗りつぶし
もう1つ、別の位置に円を描いてみます。
cv2.circle(img=img_area, center=(100,400), radius=50, color=(255,0,0), thickness=-1)
plt.imshow(img_area)
ここではthicknessを-1にしています。これで円の中を塗りつぶして表示することができます。
今度は赤く塗り潰された円を描くことができました。
直線:line()
次は線を引いてみます。
線を引くにはcv2.line()を使います。
cv2.line(img_area,pt1=(0,0),pt2=(500,500),color=(100, 255, 255),thickness=5)
plt.imshow(img_area)
ここでは図の左上から右下に線を引いてみます。その座標をpt1、pt2に渡しています。
文字:putText()
今度は文字を表示してみます。
文字を表示するにはputText()を利用します。
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img_area,text='OpenCV',org=(250,100), fontFace=font,fontScale=2,color=(255,255,255),thickness=8,lineType=cv2.LINE_AA)
plt.imshow(img_area)
まず、文字のフォントにcv2.FONT_HERSHEY_SIMPLEX を指定しました。
putText()で文字を表示するには、textに文字を渡します。ここでは「OpenCV」を表示します。orgに文字を表示する位置(左下)の座標を指定します。
fontFaceに先ほど指定したfontを指定し、fontScaleで文字の大きさを指定します。色はここでは白にしました。
lineTypeとしてアンチエイリアスのcv2.LINE_AAを渡しています。これはデフォルトでは縦横斜めの8連結を示すcv2.LINE_8です。縦横の4連結はcv2.LINE_4です。
白色の文字でOpenCVと表示されているのがわかります。
多角形を描く – polylines()
今度は多角形の描画をしてみましょう。
多角形を描画するには、多角形の頂点の座標が必要です。頂点の座標はROWSx1x2のサイズの配列のデータにします。ROWSは頂点の数を示し、データはint32型にする必要があります。
では画像を作って行きましょう。4つの頂点を持つ多角形を描画してみます。
img_area = np.zeros(shape=(500,500,3),dtype=np.int32)
zeros()を使って黒い画像の領域を作ります。これは最初にやったことと同じですが、int32になっていることに注意です。
次に4つの頂点のデータを作って行きます。
vertex = np.array([[100,300],[200,100],[400,200],[450,400]],np.int32)
4つの頂点のリストを配列にしています。
配列の型を確認してみます。
vertex.shape
ここまでをみてみましょう。
4行2列のデータになっています。
多角形の頂点データはROWSx1x2の形にならないといけません。そこでこれをreshape()を使って変換します。
pts = vertex.reshape((-1,1,2))
pts.shape
reshape(-1)は行ベクトルになります。これを1×2のデータで変換していくのでROWSx1x2の形になります。
4x1x2でROWSx1x2の形になっているのがわかります。
ようやく多角形の描画になります。
多角形の描画にはcv2.polylines()を使います。
cv2.polylines(img_area, [pts], isClosed=True, color=(255,0,0), thickness=5)
plt.imshow(img_area)
polylines()にimg_areaを渡し、座標をここでは[pts]で与えます。isClosedをTrueとすることで閉じた多角形を描画することになります。色は赤、線の太さは5にしました。
描画してみましょう。
多角形が描画されました。
最後に
PythonにOpenCVをインポートして画像に線や図を描画する方法を学んできました。
図の座標の方向は、左上が頂点としてx軸は右、y軸は下にプロットするので通常の数学の座標イメージと違うので注意しましょう。
ここでは矩形をrectangle()、円をcircle()、直線をline()、テキストをputText()、 多角形をpolylines()で描画しました。