MATLAB,Python,Scilab,Julia比較 第3章 その62【アフィン変換⑥】

MATLAB,Python,Scilab,Julia比較 第3章 その62【アフィン変換⑥】 数値計算
MATLAB,Python,Scilab,Julia比較 第3章 その62【アフィン変換⑥】

バックナンバーはこちら。
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( )

処理結果

フクさん
フクさん

処理結果は以下。

キャンパス拡張(Python(NumPy))

考察

太郎くん
太郎くん

これも手順としてはMATLABと一緒だね。

太郎くん
太郎くん

黒の空間を作ってる、コードって、この部分だと思うんだけど、

e_img = np.zeros((HID, WID),dtype='uint8')
太郎くん
太郎くん

uint8の型指定をしているのか。

フクさん
フクさん

画像データ自体がuint8だからね。
それに合わせてる感じだ。
MATLABのように保存時にuint8にキャストするのもアリだ。

太郎くん
太郎くん

ここら辺の型の問題がいきなり顔を出すから画像処理系は混乱しやすいんだよなー。

フクさん
フクさん

まぁ、型のミスがあると、まともな画像にならないから、
気付きやすいミスではあるけどね。

まとめ

フクさん
フクさん

まとめだよ。

  • キャンパス拡張をPython(NumPy)で実施。
  • 手順としてはMATLABと一緒。
  • 黒空間を作る際にuint8の型で作成。
    • 保存時にキャストしてもOK。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました