کد زیر را به گونه ایی تغییر دهید که تصاویر خروجی هم ترازتر باشند:                                                                                                                                                                                                                                                                                                import os
import zipfile
import cv2
import numpy as np
import matplotlib.pyplot as plt

# استخراج فایل‌های زیپ (در صورت نیاز)
# اطمینان حاصل کنید که فایل‌های زیپ در مسیر درست قرار دارند
# اگر فایل‌ها قبلاً استخراج شده‌اند، می‌توانید این قسمت را نادیده بگیرید

# مثال استخراج فایل زیپ
# local_zip = "/content/drive/MyDrive/hw1.zip"
# with zipfile.ZipFile(local_zip, 'r') as zip_ref:
#     zip_ref.extractall(path="/content/prokudin-Gorskii")

# مسیر تصویر اصلی
image_path = '/content/prokudin-Gorskii/hw1/test.jpg'

# بررسی وجود فایل تصویر
if not os.path.exists(image_path):
    print(f"فایل {image_path} وجود ندارد. لطفاً مسیر را بررسی کنید.")
    print("فایل‌های موجود در دایرکتوری:")
    print(os.listdir('/content/prokudin-Gorskii/hw1/'))
    exit()

# بارگذاری تصویر اصلی
image = cv2.imread(image_path)

# بررسی اینکه تصویر به درستی بارگذاری شده باشد
if image is None:
    print("تصویر یافت نشد یا خواندن آن با مشکل مواجه شد.")
    exit()

# جدا کردن کانال‌های رنگی
B, G, R = cv2.split(image)

# تعیین اندازه اصلی تصویر
height, width = image.shape[:2]

# تعریف شیفت‌ها برای هر کانال
shift_R = (50, 50)    # (x, y) برای کانال R
shift_G = (80, 70)    # (x, y) برای کانال G
shift_B = (110, 90)   # (x, y) برای کانال B

# محاسبه اندازه بوم سفید بزرگتر بر اساس بزرگترین شیفت
max_shift_x = max(shift_R[0], shift_G[0], shift_B[0])
max_shift_y = max(shift_R[1], shift_G[1], shift_B[1])

# تعیین اندازه بوم سفید با اضافه کردن حاشیه
canvas_width = max_shift_x + width + 50  # اضافه کردن 50 پیکسل به راست
canvas_height = max_shift_y + height + 50  # اضافه کردن 50 پیکسل به پایین
canvas_size = (canvas_width, canvas_height)

# ایجاد بوم سفید
white_canvas = 255 * np.ones((canvas_height, canvas_width), dtype=np.uint8)

# ایجاد سه بوم جداگانه برای R، G، B با قرار دادن در موقعیت‌های مختلف
canvas_R = white_canvas.copy()
canvas_G = white_canvas.copy()
canvas_B = white_canvas.copy()

# قرار دادن لایه‌های R، G، B در موقعیت‌های مختلف
canvas_R[shift_R[1]:shift_R[1] + height, shift_R[0]:shift_R[0] + width] = R
canvas_G[shift_G[1]:shift_G[1] + height, shift_G[0]:shift_G[0] + width] = G
canvas_B[shift_B[1]:shift_B[1] + height, shift_B[0]:shift_B[0] + width] = B

# نمایش لایه‌های جابجا شده با Matplotlib
plt.figure(figsize=(15,5))

plt.subplot(1,3,1)
plt.title('Red Layer')
plt.imshow(canvas_R, cmap='gray')
plt.axis('off')

plt.subplot(1,3,2)
plt.title('Green Layer')
plt.imshow(canvas_G, cmap='gray')
plt.axis('off')

plt.subplot(1,3,3)
plt.title('Blue Layer')
plt.imshow(canvas_B, cmap='gray')
plt.axis('off')

plt.show()

# تابع برای پیدا کردن شیفت بین دو تصویر
def find_shift(img_ref, img_to_align, shift_range=20):
    best_shift = (0, 0)
    max_corr = -1

    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]))

            # محاسبه همبستگی
            corr = np.sum(img_ref * shifted) / (np.sqrt(np.sum(img_ref**2)) * np.sqrt(np.sum(shifted**2)) + 1e-5)

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

    return best_shift

# انتخاب لایه قرمز به عنوان مرجع
ref = canvas_R

# پیدا کردن شیفت‌های لایه‌های سبز و آبی نسبت به مرجع
shift_G_found = find_shift(ref, canvas_G)
shift_B_found = find_shift(ref, canvas_B)

print(f"شیفت لایه سبز: {shift_G_found}")
print(f"شیفت لایه آبی: {shift_B_found}")

# اعمال شیفت‌های معکوس برای هم‌ترازی
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

aligned_G = apply_shift(canvas_G, shift_G_found)
aligned_B = apply_shift(canvas_B, shift_B_found)

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

# نمایش تصویر تراز شده با Matplotlib
plt.figure(figsize=(10,10))
plt.title('Aligned Image')
# تبدیل از BGR به RGB برای نمایش صحیح
aligned_image_rgb = cv2.cvtColor(aligned_image, cv2.COLOR_BGR2RGB)
plt.imshow(aligned_image_rgb)
plt.axis('off')
plt.show()

# ذخیره تصویر تراز شده
cv2.imwrite('aligned_test.jpg', aligned_image)
print("تصویر تراز شده با موفقیت ذخیره شد: 'aligned_test.jpg'")