کد زیر را در نظر بگیرید برای هر تصویر ورودی ، تصویر خروجی رنگی و بردارهای جابه جایی                                                                                                                                                                                                                                                         (tx ,ty)                                                                                                                                                                                                                                                                                                                                                                                                                           را که برای تراز کردن کانال ها استفاده شده است بیان کنید:                                                                                                                                                                                                                                                                                                                          import os
import cv2
import numpy as np
import matplotlib.pyplot as plt

# مسیرهای تصاویر
image_paths = [
    '/content/prokudin-Gorskii1/data_1/00125v.jpg',
    '/content/prokudin-Gorskii1/data_1/00149v.jpg',
    '/content/prokudin-Gorskii1/data_1/00351v.jpg',
    '/content/prokudin-Gorskii1/data_1/00398v.jpg',
    '/content/prokudin-Gorskii1/data_1/01112v.jpg'
]

def find_shift_with_ncc(img_ref, img_to_align, shift_range=20):
    best_shift = (0, 0)
    max_corr = -1

    # نرمال کردن تصاویر
    img_ref = (img_ref - np.mean(img_ref)) / (np.std(img_ref) + 1e-5)
    img_to_align = (img_to_align - np.mean(img_to_align)) / (np.std(img_to_align) + 1e-5)

    for x_shift in range(-shift_range, shift_range + 1):
        for y_shift in range(-shift_range, shift_range + 1):
            M = np.float32([[1, 0, x_shift], [0, 1, y_shift]])
            shifted = cv2.warpAffine(img_to_align, M, (img_to_align.shape[1], img_to_align.shape[0]))

            valid_mask = (shifted != 0) & (img_ref != 0)
            if np.any(valid_mask):
                corr = np.sum(img_ref[valid_mask] * shifted[valid_mask])
                corr /= (np.sqrt(np.sum(img_ref[valid_mask]**2)) * np.sqrt(np.sum(shifted[valid_mask]**2)) + 1e-5)

            if corr > max_corr:
                max_corr = corr
                best_shift = (x_shift, y_shift)

    return best_shift

def apply_shift(image, shift):
    M = np.float32([[1, 0, -shift[0]], [0, 1, -shift[1]]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    return shifted

for image_path in image_paths:
    if not os.path.exists(image_path):
        print(f"فایل {image_path} وجود ندارد.")
        continue

    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if image is None:
        print(f"تصویر {image_path} یافت نشد یا خواندن آن با مشکل مواجه شد.")
        continue

    height = image.shape[0] // 3
    width = image.shape[1]

    # جداکردن کانال‌ها از یک تصویر
    B = image[0:height]
    G = image[height:2*height]
    R = image[2*height:3*height]

    ref = R

    shift_G_found = find_shift_with_ncc(ref, G)
    shift_B_found = find_shift_with_ncc(ref, B)

    print(f"برای تصویر {os.path.basename(image_path)}:")
    print(f"شیفت لایه سبز: {shift_G_found}")
    print(f"شیفت لایه آبی: {shift_B_found}")

    aligned_G = apply_shift(G, shift_G_found)
    aligned_B = apply_shift(B, shift_B_found)

    # ادغام لایه‌های تراز شده به یک تصویر رنگی
    aligned_image = cv2.merge([aligned_B, aligned_G, ref])

    # نمایش تصویر تراز شده
    plt.figure(figsize=(10,10))
    plt.title(f'Aligned Image - {os.path.basename(image_path)}')
    aligned_image_rgb = cv2.cvtColor(aligned_image, cv2.COLOR_BGR2RGB)
    plt.imshow(aligned_image_rgb)
    plt.axis('off')
    plt.show()

    # ذخیره تصویر تراز شده
    output_filename = f"aligned_{os.path.basename(image_path)}"
    cv2.imwrite(output_filename, aligned_image)
    print(f"تصویر تراز شده با موفقیت ذخیره شد: '{output_filename}'\n")