赞
踩
彩色图像处理可分为两个主要领域:全彩色处理和伪彩色处理。在第一类中, 通常要求图像用全彩色传感器获取,如彩色电视摄像机或彩色扫描仪。在第二类中,问题是对一种特定的单色灰度或灰度范围赋予一种颜色。到目前为止,多数数字彩色图像处理是在伪彩色层面完成的。
基本上,人类和某些其他动物感知一个物体颜色是由物体反射光的性质决定的。
光的特性是彩色科学的核心。术语灰度级仅提供了一个亮度的标量度量,它的范围从黑色到灰色最终到白色。
彩色光大约覆盖电磁波谱400~-700 nm的范围。用来描述彩色光源质量的3个基本量是辐射、光强和亮度。辐射是从光源流出的能量的总量,通常用瓦特(W)来度量。光强用流明来度量,它给出了观察者从光源感知的能量总和的度量。例如,由远红外波谱范围的光源发出的光,可能具有很大的能量(辐射),但是观察者却很难感知到它;它的光强几乎是零。最后,亮度是一个主观描绘子,它实际上是不可能度量的。它体现了无色的强度的概念,并且是描述色彩感觉的一个关键因素。
原色相加可以产生二次色,如深红色(红色加蓝色)、青色(绿色加蓝色)和黄色(红色加绿色)。以正确的亮度把三原色或把与二次色相对于的原色混合,即可产生白光。它还说明了三原色及其混合产生二次色。
通常用以区别不同颜色特性的是亮度、色调和饱和度。亮度具体表达了无色的强度概念。色调是光波混合中与主波长有关的属性。色调表示观察者感知的主要颜色。饱和度指的是相对的纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的。饱和度与所加白光的数量成反比。
色调与饱和度一起称为色度,因此,颜色可用其亮度和色度来表征。形成任何特殊彩色的红、绿、蓝的数量称为三色值,并分别表示为X,Y和Z。这样,一种颜色就可由其三色值系数定义为
x
=
X
X
+
Y
+
Z
y
=
Y
X
+
Y
+
Z
x=\frac{X}{X+Y+Z}\\ y=\frac{Y}{X+Y+Z}
x=X+Y+ZXy=X+Y+ZY
和
z
=
Z
X
+
Y
+
Z
z=\frac{Z}{X+Y+Z}
z=X+Y+ZZ
从以上公式可得
x
+
y
+
z
=
1
x+y+z=1
x+y+z=1
对可见光谱内光的任何波长,用于产生对应于该波长的颜色所需的三色值可直接从大量实验结果编制的曲线或表中得到。
彩色模型(也称为彩色空间或彩色系统)的目的是在某些标准下用通常可以接受的方式方便地对彩色加以说明。本质上,彩色模型是坐标系统和子空间的说明,其中,位于系统中的每种颜色都由单个点来表示。
现在所用的大多数彩色模型不是面向硬件(如彩色监视器和打印机)的,就是面向应用的,在这里,彩色操作是一个目的(例如针对动画的彩色图形创作)。在数字图像处理中,实际中最通用的面向硬件的模型是RGB (红.绿、蓝)模型,该模型用于彩色监视器和一-大类彩色视频摄像机; CMY(青、粉红、黄)模型和CMYK(青、粉红、黄、黑)模型是针对彩色打印机的;以及HSI(色调、饱和度、亮度)模型,这种模型更符合人描述和解释颜色的方式。HSI模型还有另一个优点,它可以解除图像中的颜色和灰度信息的联系,使其更适合本书中开发的许多灰度处理技术。
RGB | 在RGB模型中,每种颜色出现在红、绿、蓝的原色光谱分量中。该模型基于笛卡儿坐标系。 |
CMY/CMYK | 青色、深红色和黄色是光的二次色,换句话说,是颜料的原色。 |
HSI | 该模型可在彩色图像中从携带的彩色信息(色调和饱和度)中消去强度分量的影响。 |
在RGB模型和CMY模型中创建颜色并从一-种模型转换到另一种模型是比较简单的过程。这些彩色系统对于硬件实现很理想。另外,RGB系统与人眼强烈感知红、绿、蓝三原色的事实能很好地匹配。遗憾的是,RGB模型、CMY模型和其他类似的彩色模型不能很好地适应实际上人解释的颜色。HSI 模型是开发基于彩色描述的图像处理算法的理想工具,这种彩色描述对人来说是自然且直观的,毕竟人才是这些算法的开发者和使用者。因此,我们可以概括说明如下,可以说RGB对于图像颜色生成来说是理想的(如用彩色摄像机的图像获取,或在监视器屏幕上显示图像) ,但在用于颜色描述时则有许多的限制。
代码如下:
import matplotlib.pyplot as plt import cv2 as cv # 颜色空间转换类型 # 读取原始图像 imgBGR = cv.imread('C:/Users/Yuao/Pictures/learningTest/color.jpg', flags=1) # 读取为BGR彩色图像 print(imgBGR.shape) imgRGB = cv.cvtColor(imgBGR, cv.COLOR_BGR2RGB) # BGR 转换为 RGB, 用于 PyQt5, matplotlib imgGRAY = cv.cvtColor(imgBGR, cv.COLOR_BGR2GRAY) # BGR 转换为灰度图像 imgHSV = cv.cvtColor(imgBGR, cv.COLOR_BGR2HSV) # BGR 转换为 HSV 图像 imgYCrCb = cv.cvtColor(imgBGR, cv.COLOR_BGR2YCrCb) # BGR转YCrCb imgHLS = cv.cvtColor(imgBGR, cv.COLOR_BGR2HLS) # BGR 转 HLS 图像 imgXYZ = cv.cvtColor(imgBGR, cv.COLOR_BGR2XYZ) # BGR 转 XYZ 图像 imgLAB = cv.cvtColor(imgBGR, cv.COLOR_BGR2LAB) # BGR 转 LAB 图像 imgYUV = cv.cvtColor(imgBGR, cv.COLOR_BGR2YUV) # BGR 转 YUV 图像 # 调用matplotlib显示处理结果 titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV'] images = [imgBGR, imgRGB, imgGRAY, imgHSV, imgYCrCb, imgHLS, imgXYZ, imgLAB, imgYUV] plt.figure(figsize=(10, 8)) for i in range(9): plt.subplot(3, 3, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.tight_layout() plt.show()
实验结果:
可以看出图像在GRAY 色彩空间(灰度图像)、XYZ 色彩空间、YCrCb 色彩空间、HSV 色彩空间、HLS 色彩空间、CIELab 色彩空间、CIELuv 色彩空间、Bayer 色彩空间之间的明显区别。
伪彩色(也称为假彩色)图像处理是指基于一种指定的规则对灰度值赋以颜色的处理。术语伪彩色或假彩色用于区分对单色图像赋予彩色的处理和与真彩色图像相关的处理。伪彩色的主要应用是人目视观察和解释单幅图像或序列图像中的灰度级事件。
灰度分层(有时称为密度分层)和彩色编码技术是伪彩色图像处理的最简单的例子之一。 如果一幅图像被描述为三维函数,则分层方法可以看成是放置一些平行 于该图像的坐标平面的平面,然后,每个平面在相交的区域中“切割”图像函数。
如果灰度被分为几个区间,且每个区域赋予了不同的颜色,而未考虑到图像中灰度级的意义。在这种情况下,感兴趣的只是简单地观察构成图像的不同灰度级。当灰度级细分基于图像的物理特性时,灰度分层有很大意义并承担着重要角色。
与简单分层技术相比,其他类型的变换更通用,也更能拓宽伪彩色增强结果的范围。有一种特别有吸引力的方法见下图。这一方法的基本概念是对任何输人像素的灰度执行3个独立的变换。然后,将3个变换结果分别送人彩色电视监视器的红、绿、蓝通道。这种方法产生一幅合成图像,该合成图像的彩色内容由变换函数的特性调制。注意,这些方法是对一幅图像的灰度值进行变换,而不是位置函数。
代码如下:
import matplotlib.pyplot as plt import cv2 as cv # 灰度图像转换为伪彩色图像 gray = cv.imread('C:/Users/Yuao/Pictures/learningTest/color.jpg', flags=0) # 图片的高度, 宽度 # 伪彩色处理 pseudo1 = cv.applyColorMap(gray, colormap=cv.COLORMAP_HOT) pseudo2 = cv.applyColorMap(gray, colormap=cv.COLORMAP_PINK) pseudo3 = cv.applyColorMap(gray, colormap=cv.COLORMAP_RAINBOW) pseudo4 = cv.applyColorMap(gray, colormap=cv.COLORMAP_HSV) pseudo5 = cv.applyColorMap(gray, colormap=cv.COLORMAP_TURBO) plt.figure(figsize=(9, 6)) plt.subplot(231), plt.axis('off'), plt.title("GRAY"), plt.imshow(gray, cmap='gray') plt.subplot(232), plt.axis('off'), plt.title("cv.COLORMAP_HOT") plt.imshow(cv.cvtColor(pseudo1, cv.COLOR_BGR2RGB)) plt.subplot(233), plt.axis('off'), plt.title("cv.COLORMAP_PINK") plt.imshow(cv.cvtColor(pseudo2, cv.COLOR_BGR2RGB)) plt.subplot(234), plt.axis('off'), plt.title("cv.COLORMAP_RAINBOW") plt.imshow(cv.cvtColor(pseudo3, cv.COLOR_BGR2RGB)) plt.subplot(235), plt.axis('off'), plt.title("cv.COLORMAP_HSV") plt.imshow(cv.cvtColor(pseudo4, cv.COLOR_BGR2RGB)) plt.subplot(236), plt.axis('off'), plt.title("cv.COLORMAP_TURBO") plt.imshow(cv.cvtColor(pseudo5, cv.COLOR_BGR2RGB)) plt.tight_layout() plt.show()
实验结果如下:
我们可以看到伪彩色图像在形式和视觉表现为彩色图像,但其所呈现的颜色并非图像的真实色彩重现,仅仅是各颜色分量的像素值合成的结果。
全彩色图像处理方法分为两大类。 第一类是分别处理每一幅分量图像, 然后由分别处理过的分量图像来形成一幅处理过的合成彩色图像。第二类是直接处理彩色像素。因为全彩色图像至少有3个分量,所以彩色像素实际上是向量。
彩色变换,主要涉及在单一彩色模型内处理彩色图像的分量,而不是这些分量在不同模型间的转换。
我们用下式表达的彩色变换作为模型:
g
(
x
,
y
)
=
T
[
f
(
x
,
y
)
]
g(x,y)=T[f(x,y)]
g(x,y)=T[f(x,y)]
其中f(x, y)是彩色输人图像,g(x, y)是变换后或处理过的彩色输出图像,T是在(x, y)的空间邻域上对f
的一个算子。
在此我们仅关注形如
s
i
=
T
i
(
r
1
,
r
2
,
.
.
.
,
r
n
)
,
i
=
1
,
2
,
.
.
.
,
n
s_i=T_i(r_1,r_2,...,r_n),i=1,2,...,n
si=Ti(r1,r2,...,rn),i=1,2,...,n
的彩色变换,其中,为标记简单起见,
r
i
r_i
ri 和
s
i
s_i
si 是f(x, y)和g(x, y)在任何点处彩色分量的变量,n是彩色分量数,
T
1
,
T
2
,
.
.
.
,
T
n
{T_1, T_2,..., T_n}
T1,T2,...,Tn是对
r
i
r_i
ri操作产生
s
i
s_i
si的一组变换或彩色映射函数。注意,n个变换
T
i
T_i
Ti合并可执行式本小节第一个公式中的单一变换函数T。所选择的用于描述f和g的像素的彩色空间决定n的值。
在图6.32所示的彩色环上,与色调直接相对的另一端被称为补色。对补色的兴趣源于这样一个事实,即补色类似于灰度负值。正如在灰度情况下那样,补色对于增强嵌在彩色图像暗区的细节很有用——特别是区域在大小上占优势时。
突出图像中某个特定的彩色区域对从其周围分离出目标物是很有用的。其基本思路不是(1)显示感兴趣的颜色以便从背景中突出它们,就是(2)像模板那样使用由彩色定义的区域,以便进一步处理。
最直接的方法是延伸灰度分层技术。然而,因为一个彩色像素是一个n维参量,得到的彩色变换函数要比度变换函数复杂得多。事实上,所要求的变换比到目前为止所考虑的彩色分量变换要复杂得多。这是因为所有彩色分层方法都要求每个像素变换后的彩色分量是所有n个原始像素的彩色分量的函数。
标定成像系统的主要意义是,它允许交互和独立地校正色调和色彩的不平衡,即按两个顺序操作。在诸如过饱和及欠饱和这样的不规则色彩问题解决之前,先要校正图像的色调范围。一幅图像的色调范围(也称为主调类型)是指颜色强度的基本分布。高主调图像的多数信息集中在高(亮)强度处;低主调图像的颜色主要位于低亮度处;中主调图像的颜色则位于两者之间。正如在单色情况下那样,通常期望一幅彩色图像的强度均匀分布在高亮和阴影之间。
改善图像色调的变换通常交互地选择。其概念是实验性地调整图像亮度和对比度,以便在合适的灰度范围提供最多的细节。彩色本身并不改变。在RGB和CMY(K)空间中,这意味着使用相同的变换函数映射所有3(或4)个彩色分量;在HSI彩色空间中,则改进了亮度分量。
正确地确立一幅图像的色调特性后,就可着手进行彩色平衡工作。虽然彩色平衡可以通过客观地(使用光谱仪)分析一幅图像中的已知颜色来决定,但当存在白色区域时,即这里RGB或CMY(K)分量相等时,准确的视觉评估是可能的。对视觉颜色评估,皮肤色调是优秀的对象,因为人对固有的肤色高度敏感。鲜明的彩色,如亮红色的物体,当进行视觉彩色评估时并没有什么价值。
当存在彩色不平衡时,有很多方法来校正它。在调整一幅图像的彩色分量时,认识到每个操作都会影响到图像的全部彩色平衡是很重要的。也就是说,对一种颜色的感知会受到周围颜色的影响。不过,彩色环可用于预测-一个彩色分量如何影响其他彩色分量。例如,基于该彩色环,任何颜色的比例都可通过减小图像中相对色(或补色)数量来增大。类似地,提高两种直接邻接颜色的比例或减小与该补色邻接的两种颜色的百分比也可增大颜色的对比。
与交互式增强方法不同, 灰度直方图处理变换可自动地应用于彩色图像。直方图均衡自动地确定一种变换, 该变换试图产生具有均匀灰度值的直方图的图像。在单色图像情况下,业已证明在处理低、高和中主调图像时是合理而且成功的。然而,由于彩色图像是由多个分量组成的,所以必须考虑适应多个分量和/或直方图的灰度级技术。正如所预料的那样,单独对彩色图像的分量进行直方图均衡通常是不明智的,这将产生不正确的彩色。一种更合乎逻辑的方法是均匀地展开这种彩色灰度,而保持彩色本身(即色调)不变。
代码如下:
import matplotlib.pyplot as plt import cv2 as cv # 色彩风格变换之 OpenCV ColorMaps img = cv.imread('C:/Users/Yuao/Pictures/learningTest/color.jpg', flags=1) # 图片的高度, 宽度 plt.figure(figsize=(12, 9)) plt.subplot(4, 6, 1), plt.axis('off'), plt.title("Origin") plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)) plt.subplot(4, 6, 2), plt.axis('off'), plt.title("Gray") plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2GRAY), cmap='gray') # 色彩映射表类型描述 ColorMaps = ["AUTUMN", "BONE", "JET", "WINTER", "RAINBOW", "OCEAN", "SUMMER", "SPRING", "COOL", "HSV", "PINK", "HOT", "PARULA", "MAGMA", "INFERNO", "PLASMA", "VIRIDIS", "CIVIDIS", "TWILIGHT", "TWILIGHT_SHIFTED", "TURBO", "DEEP_GREEN"] for i in range(len(ColorMaps)): cvmap = "cv.COLORMAP_" + ColorMaps[i] pseudo = cv.applyColorMap(img, colormap=i) print(cvmap) plt.subplot(4, 6, i + 3), plt.axis('off'), plt.title(ColorMaps[i]) plt.imshow(cv.cvtColor(pseudo, cv.COLOR_BGR2RGB)) plt.tight_layout() plt.show()
实验结果如下:
以上为OpenCV 提供的22 种色彩风格类型。
在不涉及相邻元素的情况下,对彩色图像的每个像素变换后的下一步是以周围像素特性为基础改进其值。
灰度级图像平滑可以看成是一种空间滤波操作,在这种操作中,滤波模板的系数剧有相同的值。当模板滑过将平滑的图像时,每一个像素被由该模板定义的领域中的像素的平均值代替了。这一概念可容易地扩展到全彩色图像处理。
在一幅RGB彩色图像中,令
S
x
y
S_{xy}
Sxy表示中心位于(x,y)的领域定义的一组坐标。在该领域中RGB分量的向量平均值为
ϵ
ˉ
(
x
,
y
)
=
1
k
∑
(
s
,
t
)
∈
S
x
y
ϵ
(
s
,
t
)
\bar{\epsilon}(x,y)=\frac{1}{k}\sum_{(s,t)\in S_{xy}}\epsilon(s,t)
ϵˉ(x,y)=k1(s,t)∈Sxy∑ϵ(s,t)
它遵循向量相加的性质,有
ϵ
ˉ
(
x
,
y
)
=
[
1
k
∑
(
s
,
t
)
∈
R
x
y
ϵ
(
s
,
t
)
1
k
∑
(
s
,
t
)
∈
G
x
y
ϵ
(
s
,
t
)
1
k
∑
(
s
,
t
)
∈
B
x
y
ϵ
(
s
,
t
)
]
\bar{\epsilon}(x,y)=
考虑采用拉拉普拉斯的图像(尖)锐化处理。从向量分析可知,一个向量的拉普拉斯被定义为一个向量,其分量等于输入向量的各个标量分量的拉普拉斯。在RGB彩色系统中,上式中的向量
ϵ
\epsilon
ϵ的拉普拉斯变换为
▽
2
[
ϵ
(
x
,
y
)
]
=
[
▽
2
R
(
x
,
y
)
▽
2
G
(
x
,
y
)
▽
2
B
(
x
,
y
)
]
\bigtriangledown^2[\epsilon(x,y)]=
他告诉我们可以通过分别计算每一幅分量图像的拉普拉斯来计算全彩色图像的拉普拉斯。
分割是把一幅图像分成多个区域的处理。
HSI空间,在色调图像中描绘彩色很方便。典型地,为了在色调图像中分离出感兴趣的鼓励区域,将饱和度用做一幅模板图像。在彩色图像分割中不常使用亮度图像,因为它不携带彩色信息。
虽然HSI空间的工作更直观,但分割是这样一个领域,即通常用RGB彩色向量得到的结果更好。该方法很直接。假如我们的目的是在一幅RGB图像中分割某个指定的颜色区域的物体。给定一个感兴趣的有代表性彩色的彩色样点集,可得到我们希望分割的颜色的“平均”估计。令这个平均彩色用RGB向量a来表示。分割的目的是将给定图像中的每个RGB像素分类,即在指定的区域内是否有一种颜色。 为了执行这一-比较,有一个相似性度量是必要的。最简单的度量之一是欧氏距离。令z表示RGB空间中的任意一点。如果它们之间的距离小于特定的阈值
D
0
D_0
D0.则称z与a是相似的。z和a间的欧氏距离由下式给出:
D
(
z
,
a
)
=
∣
∣
z
−
a
∣
∣
=
[
(
z
−
a
)
T
(
z
−
a
)
]
1
2
=
[
(
z
R
−
a
R
)
2
+
(
z
G
−
a
G
)
2
+
(
z
B
−
a
B
2
)
]
1
2
D(z,a)=||z-a||=[(z-a)^T(z-a)]^{\frac{1}{2}}=[(z_R-a_R)^2+(z_G-a_G)^2+(z_B-a_B^2)]^{\frac{1}{2}}
D(z,a)=∣∣z−a∣∣=[(z−a)T(z−a)]21=[(zR−aR)2+(zG−aG)2+(zB−aB2)]21
其中下标R, G, B表示向量a和z的RGB分量。满足D(z, a)≤
D
0
D_0
D0的点的轨道是半径为
D
0
D_0
D0的实心球体。包含在球体内部和表面上的点满足指定的彩色准则;球体之外的点则不满足指定的颜色准则。在图像中对这两组点编码,比如说黑或白,就产生了一幅二值分割图像。
上式的一种有用推广是形如下式的距离度量:
D
(
z
,
a
)
=
[
(
z
−
a
)
T
C
−
1
(
z
−
a
)
]
1
2
D(z,a)=[(z-a)^TC^{-1}(z-a)]^{\frac{1}{2}}
D(z,a)=[(z−a)TC−1(z−a)]21
其中C是表示我们希望分割的有代表性颜色的样本的协方差矩阵”。满足D(z, a) ≤ D 0 D_0 D0的点的轨道描述了一个实心的三维椭球体,该椭球体的最大特点是主轴面向最大数据扩展方向。当C=I时,则为3x3的单位矩阵,上式就简化为z和a间的欧式距离。这时的分割与前一段中描述的分割相同。
代码如下:
import numpy as np import matplotlib.pyplot as plt import cv2 as cv # HSI 颜色空间图像分割 # 在HSV空间对绿屏色彩区域进行阈值处理,生成遮罩进行抠图 img = cv.imread('C:/Users/Yuao/Pictures/learningTest/color.jpg', flags=1) # 读取彩色图像 hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) # 将图片转换到 HSV 色彩空间 # 使用 cv.inrange 函数在 HSV 空间检查设定的颜色区域范围,转换为二值图像,生成遮罩 lowerColor = np.array([0, 43, 46]) # (下限: 红色0/43/46) upperColor = np.array([10, 255, 255]) # (上限: 红色10/255/255) binary = cv.inRange(hsv, lowerColor, upperColor) # 生成二值遮罩,指定背景颜色区域白色 binaryInv = cv.bitwise_not(binary) # 生成逆遮罩,前景区域白色开窗,背景区域黑色 matting = cv.bitwise_and(img, img, mask=binaryInv) # 生成抠图图像 (前景保留,背景黑色) # 将背景颜色更换为红色: 修改逆遮罩 (抠图以外区域黑色) imgReplace = img.copy() imgReplace[binaryInv == 0] = [0, 0, 255] # 黑色背景区域(0/0/0) 修改为红色 (BGR:0/0/255) plt.figure(figsize=(9, 6)) plt.subplot(221), plt.title("origin"), plt.axis('off') plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)) plt.subplot(222), plt.title("binary mask"), plt.axis('off') plt.imshow(binary, cmap='gray') plt.subplot(223), plt.title("invert mask"), plt.axis('off') plt.imshow(binaryInv, cmap='gray') plt.subplot(224), plt.title("matting"), plt.axis('off') plt.imshow(cv.cvtColor(matting, cv.COLOR_BGR2RGB)) plt.tight_layout() plt.show()
结果如下:
本次实验由于实验素材的原因(背景颜色与任务图像颜色有混合的地方),采用HSI颜色空间图像分割结果并不理想,但是仍然可以得到分割后的轮廓图。
5.2节讨论的噪声模型可用于彩色图像。通常,彩色图像的噪声内容在每个彩色通道中具有相同的特性,但噪声对不同的彩色通道所造成的影响不同。一种可能是个别通道的电子学故障。然而,不同的噪声水平像是由每个彩色通道的相对照射强度的差异造成的。例如,在CCD摄像机中红色滤镜的使用将减小用于红色传感器的照射强度。CCD传感器在低照明水平下就是噪声源,因此,这种情况下得到的RGB图像的红色分量图像与其他两幅分量图像相比往往是噪声源。
因为描述彩色所要求的比特数比描述灰度级所要求的比特数大3~4倍,所以数据压缩在存储和传输彩色图像中起着核心的作用。对于前几节中描述的RGB, CMY(K)和HSI图像,任何压缩对象的数据是每个彩色像素的分量(即RGB图像中各像素的红、绿、蓝分量);它们是传达彩色信息的方式。压缩是减小或消除冗余和或不相干数据的处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。