(7)画像への作画、トリミング、白黒転換

画像処理の基礎として、画像への作画(円、線)、文字入力、トリミングや白黒転換、上下や左右の反転を記載しておく。あわせてエラー処理と終了のためのお決まりコードを残しておくことにする。

今回の画像サンプルは腹ペコ青虫(686*515)にする。

〇円と線の描画と文字の挿入(インデントは反映されていません。)
# -*- coding: utf-8 -*-
import cv2

try:
img = cv2.imread('c:/temp/aomushi.jpg')

if img is None:
print('no file')
import sys
sys.exit()

# 以下が画像加工部分
cv2.circle(img,(150,300),150,(255,255,0),-1)
cv2.line(img,(50,50),(500,50),(255,0,255),10)

cv2.putText(img,'I am very hungry',(200,300),cv2.FONT_HERSHEY_SIMPLEX,0.5,(50,60,80),2)
cv2.imwrite('c:/temp/aomushiCircleLine2.jpg',img)

# 以上が変更部分

cv2.imshow('img',img)

cv2.waitKey(0)
cv2.desgtroyAllWindows()

except:
print("Error:",sys.exc_info()[0])
print(sys.exc_info()[1])
import traceback
print(traceback.format_tb(sys.exc_info()[2]))

(座標(150,300)に半径150,色(GBR)水色で塗りつぶした円と太さ10の紫の線を描く(円の-1は塗りつぶし)。文字の詳細は稿を改めて記載の予定(長いので)。

◯◯◯
円はcv2.circle()
cv2.circle(img, center, radius, color, thickness=1, lineType=cv2.LINE_8, shift=0)

四角はcv2.rectangle()
cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)

線はcv2.line()
cv2.line(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
例:
cv2.line(img, (50, 60), (125, 10), (0, 255, 255), thickness=4, lineType=cv2.LINE_AA)

矢印はcv2.allowedLine()
cv2.arrowedLine(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0, tipLength=0.1)
引数tipLengthは矢の先の部分の長さ。全体の長さに対する比で表し、デフォルトは0.1。
cv2.rectangle()やcv2.line()のような図形描画の関数は、戻り値としてNumPyの配列ndarrayを返す。

楕円は説明が必要。
cv2.ellipse(img, box, color, thickness=1, lineType=cv2.LINE_8)
楕円関数の引数は、boxは(center, axes, angle)で表し、centerは(x, y)、axesは(横方向直径, 縦方向直径)、回転角度angleはx軸方向を0度として時計回りに度で指定する。

cv2.ellipse(img, ((240, 105), (20, 50), 30), (0, 0, 0), thickness=-1)

〇白黒変換(グレースケールへ変換)
グレイスケール画像への変換(2種)。読み込みのコードは下記。
img = cv2.imread('c:/temp/aoumushi.jpg',cv2.IMREAD_GRAYSCALE)
あるいは
img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
この方法はそもそも読み込む時に変換する方法である。
画像は0から255までの256階調に変換される。画像は、11/27の兄弟画像参照。

〇左右あるいは上下の反転(フリップという)

img_new = cv2.flip(img,0)  # X軸周りでの反転(上下反転、flipCodeが0)
img_new = cv2.flip(img,1)  # Y軸周りでの反転(左右反転、flipCodeが>0(正))
img_new = cv2.flip(img,-1) # 両軸周りでの反転(flipCodeが<0(負))

◯トリミング:座乗の指定
原画像のトリミングする部分を原点側座標、遠位側座標を指定して切り出すイメージ。
img_trim = img[y0:y1,x0:x1] # 縦(y軸)、横(x軸)の順番で、画像の位置配列の始点と終点を指定する。
img_trim = img[100:400,100:400]が以下。


________________________

移動やフィルター加工などの変換にはベクトル、三角関数行列式の理解が不可欠なので、このあとはしばらく高校時代の数学を思い出しながら学習することにした。