タイル状の画像から最小単位を切り取る

プログラム

import cv2
import numpy as np

# 元画像とテンプレート画像のパス
image_path = "checkerboard.png"

# 元画像を読み込む
img = cv2.imread(image_path)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# テンプレート画像として使用する部分を指定して切り取る(例: 画像の左上を30%の範囲で切り取る)
height, width = gray_img.shape
cut_width = int(width * 0.30)
cut_height = int(height * 0.30)
template = gray_img[0:cut_height, 0:cut_width]

# テンプレートマッチングを実行
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)

# マッチングのしきい値を0.99に設定
threshold = 0.99
loc = np.where(result >= threshold)

# 初期化
min_y_when_x_zero = float('inf')
min_x_when_y_zero = float('inf')

# 見つかった場所をチェック
for pt in zip(*loc[::-1]):
    if pt[0] == 0 and pt != (0, 0):
        min_y_when_x_zero = min(min_y_when_x_zero, pt[1])
    if pt[1] == 0 and pt != (0, 0):
        min_x_when_y_zero = min(min_x_when_y_zero, pt[0])

# 結果をプリント
print(f"Xがゼロのときの最小Yの座標 (excluding (0, 0)): {min_y_when_x_zero}")
print(f"Yがゼロのときの最小Xの座標 (excluding (0, 0)): {min_x_when_y_zero}")

# 指定された範囲を元画像から切り取る
if min_x_when_y_zero != float('inf') and min_y_when_x_zero != float('inf'):
    cropped_img = img[0:min_y_when_x_zero - 1, 0:min_x_when_y_zero - 1]

    # 切り取った画像を保存
    output_cropped_path = "output_cropped.png"
    cv2.imwrite(output_cropped_path, cropped_img)
    print(f"切り取った画像を保存しました: {output_cropped_path}")

# 見つかった場所を赤い矩形で囲む
for pt in zip(*loc[::-1]):
    if pt != (0, 0):
        cv2.rectangle(img, pt, (pt[0] + cut_width, pt[1] + cut_height), (0, 0, 255), 2)

# 結果を保存
output_path = "output_detected.png"
cv2.imwrite(output_path, img)

print(f"結果を保存しました: {output_path}")

Python

Posted by eightban