【入門】キャンバス拡張(Python)【数値計算】

【入門】キャンバス拡張(Python)【数値計算】 数値計算
【入門】キャンバス拡張(Python)【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、

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

を書き直したもの。

タイトルはアフィン変換になっているが、
実際にはキャンバス拡張の話。
今回はPython(NumPy)で実施する。

キャンバス拡張【再掲】

まずは、キャンパス拡張のイメージを再掲。

キャンパス拡張、画像の縦横を取得して大き目の画像を生成、元画像を中央にコピー

今回は、これを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。

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

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