Skip to content

数字图像处理 第 2 周作业

about 457 words 99 lines of code 2 images reading time 4 minutes

修改待处理图片的路径然后运行文件 task.py ,分解图像的 R,G,B 分量,分解 C,M,Y 分量,分解 H,S,I 分量。结果分别保存在 img1_decomposed.jpgimg2_decomposed.jpg 文件中。

第一张图:

img1_decomposed

这张图片的 R,G,B 三个通道的分量强度较为接近,整体上颜色逐渐变深,约有 R>G>B ,三种分量在白人皮肤、衬衫、部分背景处强度较强,在黑人皮肤、衣服等其他地方强度较弱。

又因为 C,M,Y 通道是 R,G,B 的互补,因此约有 C < M < Y ,但是整体强度相近。三种分量均在白人衬衫、面部以及背景处较弱,在其他地方强度较强。

H 分量图中可以看出皮肤处红色分量最强,衣服处蓝色分量最强,背景以黄、绿为主。S 通道分量图片整体较暗,说明整体饱和度较低。I 通道反映图像明暗信息,对比明显,也是在白人皮肤、衬衫、部分背景处较亮,其他地方较暗。

第二张图:

img2_decomposed

这张图片的左侧区域部分花的红色分量和绿色分量强度较大,明显高于右侧区域,且右侧区域绿色分量最弱,而蓝色分量分布较为均匀。

R,G,B 相反,左侧区域部分花的青色分量和品红色分量强度较弱,明显弱于右侧区域,且右侧区域品红分量最强,而黄色分量分布较为均匀。

色调以黄色、绿色、品红色为主。整体饱和度较高,说明花朵颜色较为鲜艳。左侧区域亮度较高,右侧区域亮度较低。

附源代码 task.py

Python
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image


def decompose_image(image_path):
    image = Image.open(image_path).convert("RGB")
    image_array = np.array(image)

    r = image_array[:, :, 0]
    g = image_array[:, :, 1]
    b = image_array[:, :, 2]

    c = 255 - r
    m = 255 - g
    y = 255 - b

    r_norm = r / 255.0
    g_norm = g / 255.0
    b_norm = b / 255.0

    i = (r_norm + g_norm + b_norm) / 3.0

    min_rgb = np.minimum(np.minimum(r_norm, g_norm), b_norm)
    s = 1 - (3.0 / (r_norm + g_norm + b_norm + 1e-6)) * min_rgb

    numerator = 0.5 * ((r_norm - g_norm) + (r_norm - b_norm))
    denominator = (
        np.sqrt((r_norm - g_norm) ** 2 + (r_norm - b_norm) * (g_norm - b_norm)) + 1e-6
    )
    h = np.arccos(numerator / denominator)
    h[b_norm > g_norm] = 2 * np.pi - h[b_norm > g_norm]
    h = h / (2 * np.pi)

    plt.figure(figsize=(12, 8))

    plt.subplot(3, 3, 1)
    plt.imshow(r, cmap="gray")
    plt.title("Red Channel")
    plt.axis("off")

    plt.subplot(3, 3, 2)
    plt.imshow(g, cmap="gray")
    plt.title("Green Channel")
    plt.axis("off")

    plt.subplot(3, 3, 3)
    plt.imshow(b, cmap="gray")
    plt.title("Blue Channel")
    plt.axis("off")

    plt.subplot(3, 3, 4)
    plt.imshow(c, cmap="gray")
    plt.title("Cyan Channel")
    plt.axis("off")

    plt.subplot(3, 3, 5)
    plt.imshow(m, cmap="gray")
    plt.title("Magenta Channel")
    plt.axis("off")

    plt.subplot(3, 3, 6)
    plt.imshow(y, cmap="gray")
    plt.title("Yellow Channel")
    plt.axis("off")

    plt.subplot(3, 3, 7)
    plt.imshow(h, cmap="hsv")
    plt.title("Hue Channel")
    plt.axis("off")

    plt.subplot(3, 3, 8)
    plt.imshow(s, cmap="gray")
    plt.title("Saturation Channel")
    plt.axis("off")

    plt.subplot(3, 3, 9)
    plt.imshow(i, cmap="gray")
    plt.title("Intensity Channel")
    plt.axis("off")

    plt.suptitle("Image Decomposition")
    plt.tight_layout()

    output_filename = image_path.rsplit(".", 1)[0] + "_decomposed.jpg"
    plt.savefig(output_filename, bbox_inches="tight", dpi=300)
    print(f"Decomposed image saved as: {output_filename}")

    plt.show()


def main():
    image_path = "./img1.jpg"
    decompose_image(image_path)


if __name__ == "__main__":
    main()