基于色彩空间转换的彩色变换方法

一、概述

        彩色图像的颜色特征对图像的表现力和视觉效果有着重要影响,在媒体和娱乐、摄影和摄像、医学诊断、地理和环境研究等方面起着重要作用。然而,由于拍摄条件、光照和相机设置等因素的影响,图像的色彩和视觉效果可能不够理想。而彩色图像的处理和调整在许多应用中都起着关键的作用,如图像增强、色彩校正、特效处理等。

        本博客旨在探讨一种基于色彩空间转换的彩色变换方法,以改善彩色图像的色彩鲜艳度和变换图像色调等,实现对彩色图像颜色特征的灵活调整和优化,提高图像的色彩和视觉效果。

        彩色图像分类

  1. 全彩色图像处理:图像为彩色图
  2. 伪彩色图像处理:图像为灰度图,为每个灰度区间赋予不同的颜色而成为彩色图

        本博客中基于色彩空间转换的彩色变换方法仅针对全彩色图像处理。

二、彩色模型 

        彩色模型也称彩色空间或彩色系统,是用来精确标定和生成各种颜色的一套规则和定义,它的用途是在某些标准下用通常可接受的方式简化彩色规范。彩色模型的设计通常是为了便于硬件实现或便于对颜色的控制。

        彩色模型通常可以采用坐标系统来描述,而位于系统中的每种颜色都由坐标空间中的单个点来表示。常用的彩色模型包括RGB(红、绿、蓝)、CMY(青、品红、黄)、HSI(色调、饱和度、亮度)等。每种颜色模型都有自己的表示方式和运算规则,可以帮助我们描述和操作图像的颜色信息。

        RGB模型:在彩色显示器、彩色摄像机中广泛使用;

        CMY 模型:用于印刷行业、设计行业、艺术创作领域等;

        HSI模型:与人描述和解释颜色的方式最接近,便于人为指定颜色。

1.RGB模型

        RGB模型表示的图像由3幅分量图像组成,每种主颜色对应一幅分量图像,叠加在一起合成彩色图像,我们看到的彩色图像其实是三个灰度图像的叠加,即红色灰度(R)、绿色灰度(G)、蓝色灰度(B)。当送入RGB监视器时,这3幅图像在屏幕上混合生成一幅合成的彩色图像。在一幅RGB图像中,每个像素由一组红、绿、蓝三个分量值表示,每个分量通常用一个8比特的数字来表示,因此每个RGB彩色像素有24比特的深度。 这种深度能够产生224 种可能的颜色组合,也称作全彩色图像。RGB模型以它灵活的数字表示方式在计算机图形和图像处理中被广泛应用。

        RGB模型坐标系如图所示,其中,原点(0, 0, 0)表示黑色,(255, 255, 255)表示白色:

图1:RGB模型坐标系

        R:表示红色通道的强度或亮度。取值范围是0~255,纯红色位于R轴的最大值(255, 0,  0)处。 

        G:表示绿色通道的强度或亮度。取值范围是0~255,纯绿色位于G轴的最大值(0, 255, 0)处。 

        B:表示蓝色通道的强度或亮度。取值范围是0~255,纯蓝色位于B轴的最大值(0, 0, 255) 处。

        例如,根据图片“荷花”提取出三幅分量图像可以明显看出,在红色通道图像中,红色成分较多的区域更亮,如荷花花瓣部分红色较多,在红色通道图像中显示出接近白色。在绿色通道图像中,绿色成分较多的区域更亮,如荷叶为绿色,其对应区域较亮。在蓝色通道图像中,蓝色成分较多的区域更亮,如天空为蓝色,其所在区域明显较亮,而荷叶等区域明显较暗。

(a)原图
 (b)红色通道图像
(c)绿色通道图像
(d)蓝色通道图像

图2:“荷花”在RGB三个通道中对应的图像

2.CMY模型

        CMY模型是采用青C品红M黄色Y 3种基本原色按一定比例合成颜色的方法。由于色彩的显示不是直接来自于光线的色彩,而是由光线被物体吸收掉一部分后反射回来的剩余光线产生,因此CMY模型又称减色法混色模型,减色基C、M、Y是加色基R、G、B的补色。

        CMY模型通过颜色相减来产生其他颜色。大多数将颜料堆积于纸上的设备,比如彩色打印机和复印机等都需要 CMY 数据输入,或在内部将RGB转换为 CMY,近似的转换公式为:

图3:RGB到CMY色彩空间转换公式

        这个公式说明,假设所有的颜色值都已经归一化在[0,1]之间,纯青色表面反射的光不包含红色(C=1–R),纯品红色表面反射的光不包含绿色(M=1-G),纯黄色表面反射的光不包含蓝色(Y=1-B)。同时,1减去一组CMY值,可以很容易地获得对应的RGB值。

        CMY模型坐标系如图所示,其中,原点(0, 0, 0)表示白色,最大值(1, 1, 1)表示黑色

图4:CMY模型坐标系

        C:表示青色通道的强度或亮度。取值范围是0~1,纯青色位于C轴的最大值(1, 0, 0)处。

        M:表示品红色通道的强度或亮度。取值范围是0~1,纯品红色位于M轴的最大值(0, 1, 0)处。

        Y:表示黄色通道的强度或亮度。取值范围是0~1,纯黄色位于Y轴的最大值(0, 0, 1)处。

        CMY模型中的颜色表示方式与RGB模型相反。在RGB模型中,颜色的强度越高,表示颜色越亮;而在CMY模型中,颜色的强度越高,表示颜色越暗。

        如下图所示,通过上下两行图片的对比能够明显看出,在CMY青色通道的图像中,红色成分越多的区域越暗,红色成分越少的区域越亮,其表示了图像中缺少红色的程度。在CMY品红色通道的图像中,绿色成分越多的区域越暗,绿色成分越少的区域越亮,其表示了图像中缺少绿色的程度。在CMY青色通道的图像中,蓝色成分越多的区域越暗,蓝色成分越少的区域越亮,其表示了图像中缺少蓝色的程度。

(a)RGB红色通道图像
(b)RGB绿色通道图像
(c)RGB蓝色通道图像
(a)CMY青色通道图像
(b)CMY品红色通道图像
(c)CMY黄色通道图像

图5:RGB与CMY模型三个通道的图像对比

3.HSI模型

        RGB模型和CMY模型不能很好地适应实际上人解释的颜色,而HSI 模型是从人的视觉系统出发,用色调(Hue)、饱和度(Saturation)和亮度 (Intensity)来描述色彩。

        下图展示了RGB各分量通道图片及HSI各分量通道图片的可视化输出,RGB分量图像相关的分析已在上文进行了具体描述,此处不再赘述。图中下左部分展示了HSI模型的色调通道,色调表示颜色的类型,如红、黄、绿等,在这个图像中,色调被转换为对应的彩色表示,以便更直观地展示色调的变化,我们很明显可以看出花瓣呈红色、天空呈蓝色、荷叶呈绿色等。图中下中部分是HSI模型的饱和度通道,饱和度代表了颜色的纯度和鲜艳度,在饱和度通道中,色彩纯净的区域会显得更亮,而灰色或不饱和的区域会显得更暗。图中下右部分是HSI模型的亮度通道。亮度代表了图像的明亮程度。在亮度通道中,不考虑颜色信息,只显示明暗变化,亮度高的区域(如云彩等)在这个通道中看起来更亮。

图6:RGB与HSI模型三个通道的图像对比展示

        HSI色彩空间可以用一个圆锥空间模型来描述,如下图所示:

图7:HSI模型坐标系

        H:色彩的基本属性,对应于不同颜色所在的角度位置,以圆形方式表示,旋转不同的截面可以得到不同的色调,取值范围通常为0~360°。

        S:色彩的纯度,描述了颜色相对于灰色的强烈程度,是一个范围在0~1之间的比例值,0表示灰度,1表示最大纯度。

        I:表示颜色的强度或亮度,是一个范围在0~1之间的比例值,0表示黑色,1表示白色。

        HSI色彩空间和RGB色彩空间只是同一物理量的不同表示,它们之间的转换关系如下

图8:RGB到HSI色彩空间转换公式

        通过将RGB色彩空间转换为HSI色彩空间,可以调整图像的色调、饱和度和亮度等。HSI模型便于颜色的分析与分类以及更自然地模拟人类对颜色的感知,但由于其色调的环绕性,使得在进行颜色距离计算时不够直观,因此在一些特定的颜色处理任务中可能不够高效。

三、彩色变换

1.RGB-CMY色彩空间变换

        由图2公式可得,求一个RGB图像在CMY色彩空间中的图像相当于求色基R、G、B的补色。因此,要想得到一张image的CMY色彩空间的图像只需255 - image(RGB图像的每个分量通常用一个8比特的数字来表示),或者1 - normalized_image(normalized_image = image / 255,进行了归一化)。

        编写代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取RGB图像
image = cv2.imread('flower.jpg')

# 显示原图
print("(a)原图:")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off') 
plt.show()

# RGB->CMY转换
cmy_image = 255 - image

# 显示CMY图
print("(b)CMY色彩空间图:")
plt.imshow(cv2.cvtColor(cmy_image, cv2.COLOR_BGR2RGB))
plt.axis('off')  
plt.show()

# 保存转换后的图像
cv2.imwrite('CMY_image.jpg', cmy_image)

        代码运行效果如下:

(a)原图 
 (b)转换为CMY色彩空间的图像
2.RGB-HSI色彩空间变换

        要想将BGR格式的图像转换为HSI格式的图像,可以使用OpenCV库中的cvtColor函数,即hsi_image = cv2.cvtColor(image, cv2.COLOR_BGR2HLS),其中,cv2.COLOR_BGR2HLS为格式转换方式。

        编写代码如下:

# RGB->HSI,直接使用库函数转换为HSI色彩空间
hsi_image = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

# 显示原图
print("(a)原图:")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off') 
plt.show()

# 显示HSI图
print("(b)HSI色彩空间图:")
plt.imshow(cv2.cvtColor(hsi_image, cv2.COLOR_BGR2RGB))
plt.axis('off')  
plt.show()

# 保存转换后的图像
cv2.imwrite('HSI_image.jpg', hsi_image)

        代码运行效果如下:

(a)原图
(b)转换为HSI色彩空间的图像

四、应用

        基于RGB->HSI色彩空间转换方法,可以实现自定义设置参数对原图在HSI色彩空间进行色调、饱和度和亮度的修改。如输入的调整参数若为h,s,i,则在色调通道、饱和度通道和亮度通道分别令h / 360s*0.01i*0.01,将输入的h,s,i值转换为0~1之间的比例,并进行取值范围的限制。

        编写代码如下:

# 自定义输入色度调整参数h、饱和度调整参数s和强度调整参数i
= float(input('Adjust hue by: '))
= float(input('Adjust saturation by: '))
= float(input('Adjust intensity by: '))

# 根据参数对各通道进行处理
hsi_image = cv2.cvtColor(image, cv2.COLOR_BGR2HLS).astype(np.float32) / 255.0
hsi_image[:, :, 0] = (hsi_image[:, :, 0] + h / 360) % 1
hsi_image[:, :, 1] = np.clip(hsi_image[:, :, 1] + s * 0.01, 0, 1)
hsi_image[:, :, 2] = np.clip(hsi_image[:, :, 2] + i * 0.01, 0, 1)

# 将HSI颜色空间转换回RGB颜色空间
rgb = cv2.cvtColor((hsi_image * 255).astype(np.uint8), cv2.COLOR_HLS2BGR)

# 显示原图
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off') 
plt.show()

# 输出处理后的RGB色彩空间图
plt.imshow(cv2.cvtColor(rgb, cv2.COLOR_BGR2RGB))
plt.axis('off')  
plt.show()

# 保存转换后的图像
cv2.imwrite('rgb_image.jpg', rgb)

        不同参数的效果如下:

原图 
色调参数h=10
饱和度参数s=10
亮度i=10
 原图 
h,s,i = 2,6,7
h,s,i = 6,2,7
h,s,i = 6,7,2

五、总结

        与传统的 RGB 颜色空间相比,其他色彩空间如CMY、HSV、HSI 等不仅能够更好地捕捉图像的颜色特征和视觉感知,同时还具有灵活性和可调性,能够通过在不同的色彩空间中调整颜色分量,精确控制图像的色调、饱和度和亮度等特性,满足不同图像处理任务的需求。

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值