图像处理技术与应用入门
颜色空间及其转换
颜色空间是一种用于在数字图像中表达和指定颜色的方法。不同的颜色空间使用不同的方式来定义颜色,每种方式都有其特定的用途和优势。以下是一些常见的颜色空间及其特点:
RGB(红绿蓝):这是最常见的颜色空间,用于计算机显示器和数字设备。在RGB颜色空间中,每种颜色都是由红色、绿色和蓝色三个基色的不同组合来定义的。每个基色可以有不同的强度,通常用0到255的整数表示,其中0表示该颜色的完全缺失,255表示该颜色的最大强度。
CMYK(青色、品红色、黄色、黑色):这种颜色空间主要用于印刷行业。与RGB不同,CMYK是一种减色模型,其中青色(Cyan)、品红色(Magenta)、黄色(Yellow)和黑色(Key)的混合用来吸收光,而不是发射光。在印刷过程中,这些颜色的不同组合可以产生几乎所有其他颜色。
HSV(色相、饱和度、亮度):HSV颜色空间是根据人眼对颜色的感知来定义的。色相(Hue)是颜色在色轮上的位置,饱和度(Saturation)是颜色的纯度,亮度(Value)是颜色的明亮程度。HSV颜色空间在图像处理中很有用,因为它可以独立地改变颜色的各个方面。
HSL(色相、饱和度、亮度):HSL与HSV类似,但亮度的概念略有不同。在HSL中,亮度(Lightness)是指颜色的明亮或暗淡程度,而HSV中的亮度(Value)是指颜色的明暗程度加上白色。HSL在网页设计和图形设计中很受欢迎。
YUV(亮度、色度):YUV颜色空间主要用于视频系统中,它将亮度信息(Y)与颜色信息(U和V)分开。这种方法可以减少颜色信息的带宽,因为人眼对亮度变化比对颜色变化更敏感。
颜色转换是指在不同的颜色空间之间转换图像颜色的过程。例如,将RGB图像转换为灰度图像就是将彩色信息转换为只有亮度信息的过程。转换通常需要数学公式和算法来确保颜色在新的颜色空间中正确地表示。
在Python的skimage库中,color.rgb2gray函数用于将RGB图像转换为灰度图像。这个函数使用前面提到的权重来计算每个像素的灰度值,从而得到一个只有亮度信息的单通道图像。这种转换在图像分析和机器视觉中很常见,因为它简化了图像处理任务,并减少了计算量。
rgb转灰度图
在图像处理中,将彩色图像转换为灰度图像是一个常见的操作。color.rgb2gray 函数是 skimage.color 模块中的一个函数,用于执行这种转换。
彩色图像通常由三个颜色通道组成:红色、绿色和蓝色(RGB)。每个像素在这三个通道上都有一个值,这些值共同决定了像素的颜色。例如,一个像素可能具有 (R, G, B) 值为 (255, 0, 0),这意味着它是纯红色的。
灰度图像只有一个通道,每个像素只有一个值,这个值代表了像素的亮度。在灰度图像中,较亮的区域有较高的值,较暗的区域有较低的值。灰度图像的像素值通常在 0 到 255 之间,其中 0 表示黑色,255 表示白色。
color.rgb2gray 函数通过一定的权重将彩色图像的三个通道合并成一个通道。这种转换通常使用以下公式:
gray=0.299×R+0.587×G+0.114×B
这里的权重是基于人眼对不同颜色的敏感度。绿色通道的权重最高,因为人眼对绿色的敏感度最高,对蓝色的敏感度最低,因此蓝色通道的权重最低。
例如,如果有一个像素的 RGB 值为 (100, 150, 200),那么它的灰度值将是:
gray=0.299×100+0.587×150+0.114×200≈148.5g
因此,这个像素在灰度图像中的值将是 148 或 149(取决于具体的实现是否四舍五入)。
转换后的灰度图像可以用于简化图像分析,减少计算量,并且有时可以突出某些特征,使其更容易检测或识别。
from skimage import io, data, color
img = data.hubble_deep_field()
gray = color.rgb2gray(img)
io.imshow(gray)
原图 灰度转换
rgb转hsv
RGB到HSV的转换是一个数学过程,它将红色、绿色、蓝色的颜色值转换为色相(Hue)、饱和度(Saturation)和亮度(Value)的值。在Python中,您可以使用skimage.color模块中的rgb2hsv函数来实现这一转换。
以下是RGB到HSV转换的基本步骤:
1.归一化RGB值:首先,将RGB值从0-255的范围转换为0-1的范围。
2.找出最大和最小值:对于每个像素,找出三个颜色通道中的最大值(Max)和最小值(Min)。
3.计算色相(H):
- 如果Max等于Min,那么H = 0(无色相)。
- 如果Max是R,那么H = (G - B) / (Max - Min)。
- 如果Max是G,那么H = 2 + (B - R) / (Max - Min)。
- 如果Max是B,那么H = 4 + (R - G) / (Max - Min)。
- 将H乘以60,得到色相的角度(在0到360之间)。
4.计算饱和度(S):
- 如果Max为0,则S = 0(无饱和度)。
- 否则,S = (Max - Min) / Max。
- 将S乘以255,得到饱和度的值(在0到255之间)。
5.计算亮度(V):
- V = Max。
- 将V乘以255,得到亮度的值(在0到255之间)。
RGB转化到HSV的算法
max=max(R,G,B):
min=min(R,G,B)
V=max(R,G,B)
S=(max-min)/max:
if R = max,H =(G-B)/(max-min)* 60
if G = max,H = 120+(B-R)/(max-min)* 60
if B = max,H = 240 +(R-G)/(max-min)* 60
if H < 0,H = H+ 360
代码:
from skimage import io, data, color
img = data.hubble_deep_field()
gray = color.rgb2hsv(img) # 色调(H),饱和度(S),亮度(V)
io.imshow(gray)
原图 hsv转换
rgb转lab
RGB到Lab颜色空间的转换是一种将红色、绿色、蓝色颜色值转换为CIE Lab颜色空间的过程。Lab颜色空间是一种设备无关的颜色空间,它旨在与人类的视觉感知更为一致。在Lab颜色空间中,L代表亮度,a和b代表颜色对立维度,其中a表示从绿到红的颜色范围,b表示从蓝到黄的颜色范围。
from skimage import io, data, color
img = data.hubble_deep_field()
gray = color.rgb2lab(img) # Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。
# a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);
# b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。
io.imshow(gray)
原图 hsv转换
Hvs转rgb
HSV转化到RGB的算法
if s = 0R=G=B=VelseH /= 60;i = INTEGER(H)f = H - ia = V * ( 1 - s )b = V * ( 1 - s * f )c = V * ( 1 - s * (1 - f ) )switch(i)case 0: R = V; G = c; B = a;case 1: R = b; G = v; B = a;case 2: R = a; G = v; B = c;case 3: R = a; G = b; B = v;case 4: R = c; G = a; B = v;case 5: R = v; G = a; B = b;
from skimage import io, data, color
img = data.hubble_deep_field()
gray = color.hsv2rgb(img)
io.imshow(gray)
原图 hsv转换
Lab转rgb
from skimage import io, data, color
img = data.hubble_deep_field()
gray = color.lab2rgb(img)
io.imshow(gray)
原图 hsv转换
根据标签值对图片进行着色
from skimage import io, color
import numpy as np
img = io.imread("dd.jpg")
gray = color.rgb2gray(img)
rows, cols = gray.shape
labels = np.zeros([rows,cols])
for i in range(rows):
for j in range(cols):
if (gray[i,j]<0.4):
labels[i,j]=0
elif(gray[i,j]<0.75):
labels[i,j]=1
else:
labels[i,j]=2
dstt = color.label2rgb(labels)
io.imshow(dstt)
读取一个彩色图像,将其转换为灰度图像,然后根据灰度值将图像分割为三个区域(暗、中、亮),并使用不同的颜色对每个区域进行标记,最后显示了着色后的图像。这种方法可以用于图像分析、分割或可视化,以突出不同的图像区域。
原图 标签着色图像