第4回 課題解答

元画像の例

課題1 : 画像上の座標の取得

import tkinter as tk
from tkinter import Canvas
from PIL import Image, ImageTk


# ウィンドウのクラス
class Window:
  # ウィンドウのサイズ
  WIDTH = 800
  HEIGHT = 600

  # コンストラクタ
  def __init__(self, root):
    # ウィンドウの設定
    self.root = root
    self.canvas = Canvas(root, width=self.WIDTH, height=self.HEIGHT)
    self.canvas.pack()

    # 画像の読み込み
    self.image = Image.open("source.jpg")
    # 画像をリサイズする
    self.image_resized = self.image.resize((self.WIDTH, self.HEIGHT))
    # 画像をCanvasに表示する
    self.photo = ImageTk.PhotoImage(self.image_resized)
    self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
    # クリックイベントの設定
    self.canvas.bind("<Button-1>", self.on_click)

  # クリックイベント
  def on_click(self, event):
    # クリックした位置の座標を取得する
    x = event.x
    y = event.y
    # 元画像のサイズ
    original_width, original_height = self.image.size
    # クリックした位置の元画像の座標を計算する
    original_x = int(x * original_width / self.WIDTH)
    original_y = int(y * original_height / self.HEIGHT)
    # 元画像上の座標を表示
    print(f"元画像上の座標: ({original_x}, {original_y})")


# メイン
if __name__ == "__main__":
  # ウィンドウの作成
  root = tk.Tk()
  # ウィンドウのタイトル
  root.title("1")
  window = Window(root)
  # ループ
  root.mainloop()
コンソールの表示例

課題2 : 射影変換

import cv2
import numpy as np

# 画像の読み込み
img = cv2.imread('source.jpg')
# 画像のサイズを取得
height, width = img.shape[:2]

# 変換エリアの頂点座標を指定(左上、右上、右下、左下の順)
# 数値は元画像によって変わる
corner = np.array([[578, 1003], 
                   [2213, 492], 
                   [2295, 1477], 
                   [474, 1527]],
                  dtype=np.float32)

# 変換後の画像サイズを指定
# 数値は元画像によって変わる
new_width = 1000
new_height = 400

# 変換後の頂点座標を指定(左上、右上、右下、左下の順)
new_corner = np.array([[0, 0],
                        [new_width, 0],
                        [new_width, new_height],
                        [0, new_height]],
                       dtype=np.float32)
# 透視変換行列を計算
M = cv2.getPerspectiveTransform(corner, new_corner)
# 透視変換を実行
new_img = cv2.warpPerspective(img, M, (new_width, new_height))
# 画像を保存
cv2.imwrite('2.jpg', new_img)
できる画像