バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
タイトルはアフィン変換になっているが、
実際にはキャンパス拡張の話。
今回はPython(NumPy)で実施する。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
キャンパス拡張【再掲】
太郎くん
まずは、キャンパス拡張のイメージを再掲。
フクさん
今回は、これをPython(NumPy)で実現する。
Pythonコード
フクさん
Pythonコードは以下。
import numpy as np
import cv2
# キャンパス拡張
def canvas_expansion(img, x, y):
H,W=img.shape
WID=W+x
HID=H+y
e_img = np.zeros((HID, WID),dtype='uint8')
e_img[int((HID-H)/2):int((HID+H)/2), int((WID-W)/2):int((WID+W)/2)] = img;
img = e_img
return img
def affine_transformation_test( ):
# 入力画像の読み込み
img = cv2.imread("dog.jpg")
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
# SDTVグレースケール
img = np.array(0.2990 * r + 0.5870 * g + 0.1140 * b, dtype='uint8')
# キャンパス拡張
img = canvas_expansion(img, 300, 300)
# グレースケール画像の書き込み
cv2.imwrite("dog_canvas_expansion.jpg", img)
affine_transformation_test( )
処理結果
フクさん
処理結果は以下。
考察
太郎くん
これも手順としてはMATLABと一緒だね。
太郎くん
黒の空間を作ってる、コードって、この部分だと思うんだけど、
e_img = np.zeros((HID, WID),dtype='uint8')
太郎くん
uint8の型指定をしているのか。
フクさん
画像データ自体がuint8だからね。
それに合わせてる感じだ。
MATLABのように保存時にuint8にキャストするのもアリだ。
太郎くん
ここら辺の型の問題がいきなり顔を出すから画像処理系は混乱しやすいんだよなー。
フクさん
まぁ、型のミスがあると、まともな画像にならないから、
気付きやすいミスではあるけどね。
まとめ
フクさん
まとめだよ。
- キャンパス拡張をPython(NumPy)で実施。
- 手順としてはMATLABと一緒。
- 黒空間を作る際にuint8の型で作成。
- 保存時にキャストしてもOK。
バックナンバーはこちら。
コメント