end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

opencv for python で画像を比較し、pillow for python で結果をマルチページtiffにまとめる

import cv2
from PIL import Image

def highlight_differences(image1_path, image2_path, output_path):
    # 画像を読み込む
    image1 = cv2.imread(image1_path)
    image2 = cv2.imread(image2_path)

    # 画像をグレースケールに変換
    gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

    # 画像の差分を計算
    diff = cv2.absdiff(gray1, gray2)

    # 差分を二値化
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # 輪郭を検出
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 差分をハイライト
    for contour in contours:
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 255), 2)

    # ハイライトされた画像を保存
    cv2.imwrite(output_path, image1)

    # ハイライトされた画像を表示
    # cv2.imshow('Differences', image1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 2ページ目にimg_2を追加して保存
    add_image_to_tiff(output_path, image2_path)

def add_image_to_tiff(tiff_path, image_path):
    # 既存のTIFFファイルを読み込む
    tiff_image = Image.open(tiff_path)
    # 追加する画像を読み込む
    new_image = Image.open(image_path)

    # 既存のTIFFファイルのページをリストに追加
    images = [tiff_image]
    try:
        while True:
            tiff_image.seek(tiff_image.tell() + 1)
            images.append(tiff_image.copy())
    except EOFError:
        pass

    # 新しい画像をリストに追加
    images.append(new_image)

    # すべての画像を新しいTIFFファイルとして保存
    images[0].save(tiff_path, save_all=True, append_images=images[1:], compression="tiff_deflate")

img_1 = "IMAGE_01.tif"
img_2 = "IMAGE_02.tif"
diff_2 = "IMAGE_diff.tif"

# 使用例
highlight_differences(img_1, img_2, diff_2)