数字图像处理:彩色图片处理,HSI模型

本文详细介绍了如何将RGB色彩模型转换为HSI色彩模型,通过数学公式解析了色调H、饱和度S和亮度I的计算过程。并通过Python代码实现了这一转换,特别针对红色的提取进行了优化,展示了在不同色彩空间下颜色提取的效果对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求

提取一副彩色图像中红色,用HIS模型处理。

RGB2HSI

公式:
求Theta
在这里插入图片描述
根据b g 大小确定H:

H={θ B <= G 360−θ B > GH= \begin{cases} \theta & \text{ B <= G }\\ 360 - \theta & \text{ B > G} \end{cases}H={θ360θ B <= G  B > G

s=1−3(R+G+B)[min(R,G,B)]s = 1 - \frac{3}{(R+G+B)}[min(R,G,B)]s=1(R+G+B)3[min(R,G,B)]

I=13(R+G+B)I = \frac{1}{3}(R+G+B)I=31(R+G+B)

下面函数实现RGB转HSI模型,并对350≤H≤360350\leq H \leq360350H3600≤H≤100 \leq H \leq 100H10保存,以达到提取红色的目的:

def bgr_2_hsi(image):
    """
    :param image: RGB model image
    :return: HSI model image and slicing image in H
    """
    out = np.copy(image)
    out_slicing = np.zeros(image.shape, np.uint8)

    for x in range(image.shape[0]):
        # print(str(int(x / image.shape[0] * 100)) + "%")
        for y in range(image.shape[1]):
            b, g, r = image[x][y]
            b, g, r = int(b), int(g), int(r)
            i_s = np.sum([b, g, r])
            i = i_s / 3
            
            # i == 0, s and h is no sense
            if i_s == 0:
                i = 0
                s = 0
                h = 0
                out[x][y] = h, s, i
                continue

            s = (1 - (3 * np.min([b, g, r])) / i_s) * 255

            # s == 0 h is no sense
            if s == 0:
                h = 0
                out[x][y] = h, s, i
                continue

            thea = np.arccos((2 * r - g - b) / (2 * np.sqrt((r - g) ** 2 + (r - b) * (g - b))))
            if g >= b:
                h1 = thea
            else:
                h1 = np.pi * 2 - thea
            h1 = np.rad2deg(h1)
            # slicing
            if (int(h1) in range(0, 11) or int(h1) in range(350, 361) ) and s/255 > 0.1:
                print(int(h1))
                out_slicing[x][y] = image[x][y]

            h = h1 / 360 * 255
            out[x][y] = h, s, i

    return out, out_slicing

结果

原图:
在这里插入图片描述
HSI模型中色调H分量:
在这里插入图片描述
HSI模型中饱和度S分量:
在这里插入图片描述
HSI模型中亮度I分量:
在这里插入图片描述
抽取的结果:
在这里插入图片描述
有噪声是因为图片质量问题

补充1

RGB模型进行分层

def color_slicing(image, center, w):
    """
    :param image: 
    :param center: b, g, r ib range 0 ~ 255
    :param w: width
    :return: 
    """
    out = np.zeros(image.shape, np.uint8)
    for x in range(image.shape[0]):
        for y in range(image.shape[1]):
            r_b, r_g, r_r = center
            a_b, a_g, a_r = image[x][y]
            if abs(r_b - a_b) < w/2 and abs(r_g - a_g) < w/2 and abs(r_r - a_r) < w/2:
                out[x][y] = image[x][y]
    return out

调用:

image_cloor_slicing = color_slicing(image, (0.1922 *255, 0.1608 *255, 0.6863 * 255), 0.2549*255)

结果

原图:
在这里插入图片描述
在宽度为W=0.2549,中心在(0.6863,0.1608,0.1922)的RGB立方体中检测红色的彩色分层变换:
在这里插入图片描述
在宽度为W=0.4549,中心在(0.7863,0.1608,0.1922)的RGB立方体中检测红色的彩色分层变换:
在这里插入图片描述
使用HSI分层:
在这里插入图片描述
使用HSI模型相比较于RGB模型,可以更直观的提取颜色

补充2

HSI2RGB

def hsi_2_bgr(image):
    out = np.copy(image)

    for x in range(image.shape[0]):
        for y in range(image.shape[1]):
            h, s, i = image[x][y]
            h, s, i = h / 255 * 360, s / 255, i / 255
            b, g, r = 0, 0, 0
            # not use float in range(int, int) :(
            if h >= 0 and  h < 120:  # RG
                b = i * (1 - s)
                r = i * (1 + (s * math.cos(math.radians(h)) / math.cos(math.radians(60 - h))))
                g = 3 * i - (b + r)
            elif h >= 120 and  h < 240:  # GB
                h -= 120
                r = i * (1 - s)
                g = i * (1 + (s * math.cos(math.radians(h)) / math.cos(math.radians(60 - h))))
                b = 3 * i - (r + g)
            elif h >= 240 and  h < 360:  # BR
                h -= 240
                g = i * (1 - s)
                b = i * (1 + (s * np.cos(math.radians(h)) / np.cos(math.radians(60 - h))))
                r = 3 * i - (g + b)

            out[x][y] = b * 255, g * 255, r * 255
    return out

结果

原图:
在这里插入图片描述
HSI:
在这里插入图片描述
再转回RGB:
在这里插入图片描述
黄、青、深红不知道为什么还原不了

### 数字图像处理期末考试试题 #### 填空题 (每题2分,共10分) 1. 数字图像是物理图像的__________表示,是连续物体表面的离散数字表示。[^1] 2. 图像的空间坐标数字化称为__________。 3. HSI模型中的S代表__________。 4. 真彩色RGB图像由三个通道组成,分别是红色、绿色和__________。 5. 量化是指图像__________值(灰度值)的数字化。 #### 单项选择题 (每题4分,共20分) 1. 下列哪种类型的图像只有黑白两种颜色? a) 灰度级图像 b) 二值图像 c) 索引图像 d) 真彩色RGB图像 2. 在HSI模型中,哪个分量与人的视觉感知最为接近? a) 色调(Hue) b) 饱和度(Saturation) c) 强度(Intensity) d) 对比度(Contrast) 3. 如果一幅图像的空间分辨率较低,则该图像会出现什么情况? a) 尺寸变大 b) 细节更清晰 c) 失去部分信息 d) 文件大小增加 4. 下面哪一项不是数字图像的主要类型? a) 灰度级图像 b) 彩色图像 c) 索引图像 d) 二值图像 5. 当图像的灰度级别降低时,会发生什么变化? a) 图像变得更亮 b) 图像质量提高 c) 图像细节更加模糊 d) 文件体积增大 #### 判断题 (每题2分,共10分) 1. 数字化过程包括采样和量化两个阶段。() 2. HSI模型不适合作为图像处理的基础模型之一。() 3. 空间分辨率越高,图像文件越大。() 4. RGB色彩模式可以直接用于印刷品制作。() 5. 量化等级越多,图像质量越好。() #### 名词解释 (每题5分,共10分) 1. **采样** 2. **量化** #### 问答题 (每题10分,共20分) 1. 解释为什么HSI模型适合用于图像处理? 2. 描述数字图像的不同类型及其特点。 #### 计算分析题 (每题15分,共30分) 1. 已知某幅图像分辨率为800×600像素,采用8位灰度级存储,请计算其数据量是多少KB? 2. 设有一张真彩(RGB)图片,尺寸为1920*1080px,每个颜色通道占用8bit,请问这张图片未压缩前的数据总量大约有多少MB? ```python # Python code to calculate the data size of an image def calc_image_size(width, height, bits_per_pixel): bytes_per_pixel = bits_per_pixel / 8 total_bytes = width * height * bytes_per_pixel kb = total_bytes / 1024 mb = kb / 1024 return round(kb), round(mb) width_1 = 800 height_1 = 600 bits_per_pixel_1 = 8 kb_1, _ = calc_image_size(width_1, height_1, bits_per_pixel_1) print(f"The grayscale image's file size is {kb_1} KB") width_2 = 1920 height_2 = 1080 bits_per_pixel_2 = 24 # For true color images with three channels _, mb_2 = calc_image_size(width_2, height_2, bits_per_pixel_2) print(f"The true color image's file size is approximately {mb_2} MB") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值