کد زیر را به طور کامل و با جزئیات توضیح بده
import cv2
import numpy as np
import matplotlib.pyplot as plt

# تابع برای تولید ماتریس دایترینگ
def create_dithering_matrix(n):
    if n == 2:
        return np.array([[0, 2], [3, 1]], dtype=np.float32) / 4
    elif n == 4:
        return np.array([[0, 8, 2, 10], [12, 4, 14, 6], [3, 11, 1, 9], [15, 7, 13, 5]], dtype=np.float32) / 16
    elif n == 8:
        return np.array([[0, 32, 8, 40, 2, 34, 10, 42],
                         [48, 16, 56, 24, 50, 18, 58, 26],
                         [12, 44, 4, 36, 14, 46, 6, 38],
                         [60, 28, 52, 20, 62, 30, 54, 22],
                         [3, 35, 11, 43, 1, 33, 9, 41],
                         [51, 19, 59, 27, 49, 17, 57, 25],
                         [15, 47, 7, 39, 13, 45, 5, 37],
                         [63, 31, 55, 23, 61, 29, 53, 21]], dtype=np.float32) / 64
    else:
        raise ValueError("Supported dithering matrix sizes are 2x2, 4x4, and 8x8")

# تابع برای اعمال الگوریتم Ordered Dithering
def ordered_dithering(image, dither_matrix):
    h, w = image.shape
    n = dither_matrix.shape[0]
    dithered_image = np.zeros((h, w), dtype=np.uint8)

    for i in range(h):
        for j in range(w):
            threshold = dither_matrix[i % n, j % n] * 255
            if image[i, j] > threshold:
                dithered_image[i, j] = 255
            else:
                dithered_image[i, j] = 0
    return dithered_image

# خواندن تصویر
image = cv2.imread('/content/2300.JPG')

# چک کردن اینکه آیا تصویر به درستی بارگذاری شده است
if image is None:
    print("خطا در بارگذاری تصویر")
else:
    # به دست آوردن ابعاد تصویر
    height, width, channels = image.shape
    print("عرض تصویر:", width)
    print("ارتفاع تصویر:", height)
    print("تعداد کانال‌ها:", channels)

    # استخراج کانال آبی (0 برای آبی، 1 برای سبز، 2 برای قرمز)
    blue_channel = image[:, :, 0]

    # نمایش تصویر کانال آبی به صورت خاکستری
    plt.imshow(blue_channel, cmap='gray')
    plt.title("Blue Channel in Grayscale")
    plt.axis("off")
    plt.show()

    # گام 1: الگوریتم Random Dithering
    random_dither_image = np.zeros((height, width), dtype=np.uint8)
    for i in range(height):
        for j in range(width):
            random_value = np.random.randint(0, 256)
            if blue_channel[i, j] > random_value:
                random_dither_image[i, j] = 255  # سفید
            else:
                random_dither_image[i, j] = 0    # سیاه

    # گام 2: الگوریتم Average Dithering
    average_intensity = np.mean(blue_channel)
    average_dither_image = np.zeros((height, width), dtype=np.uint8)
    for i in range(height):
        for j in range(width):
            if blue_channel[i, j] > average_intensity:
                average_dither_image[i, j] = 255  # سفید
            else:
                average_dither_image[i, j] = 0    # سیاه

    # گام 3: پیاده‌سازی الگوریتم Ordered Dithering با ابعاد مختلف
    dither_matrices = [2, 4, 8]
    ordered_dithered_images = []

    for n in dither_matrices:
        dither_matrix = create_dithering_matrix(n)
        dithered_image = ordered_dithering(blue_channel, dither_matrix)
        ordered_dithered_images.append((n, dithered_image))

        # ذخیره تصویر Ordered Dithering با اندازه ماتریس مختلف
        filename = f"ordered_dither_{n}x{n}.png"
        cv2.imwrite(filename, dithered_image)
        print(f"تصویر {filename} ذخیره شد.")

    # ذخیره تصاویر Random و Average Dithering
    cv2.imwrite("random_dither.png", random_dither_image)
    cv2.imwrite("average_dither.png", average_dither_image)
    cv2.imwrite("blue_channel_grayscale.png", blue_channel)

    # نمایش تصاویر
    plt.figure(figsize=(20, 10))

    # کانال آبی تصویر اصلی
    plt.subplot(2, 3, 1)
    plt.imshow(blue_channel, cmap='gray')
    plt.title("Blue Channel in Grayscale")
    plt.axis("off")

    # تصویر Random Dithering
    plt.subplot(2, 3, 2)
    plt.imshow(random_dither_image, cmap='gray')
    plt.title("Random Dithering")
    plt.axis("off")

    # تصویر Average Dithering
    plt.subplot(2, 3, 3)
    plt.imshow(average_dither_image, cmap='gray')
    plt.title("Average Dithering")
    plt.axis("off")

    # تصاویر Ordered Dithering با ابعاد مختلف
    for idx, (n, dithered_image) in enumerate(ordered_dithered_images, start=4):
        plt.subplot(2, 3, idx)
        plt.imshow(dithered_image, cmap='gray')
        plt.title(f"Ordered Dithering {n}x{n}")
        plt.axis("off")

    plt.show()