作业-计算机视觉1

一、作业题目

在校园内采集两组图像,在图像上选取一稳定色彩区域,并采用不同的色彩空间进行颜色差异性评价

二、RGB空间

2.1 空间显示

首先对RGB图像空间进行分析,采取一张叶子图片进行分析,分别单个显示其红色通道、绿色通道以及蓝色通道,并绘制每一个通道的直方图。结果如下,执行代码见附录6.1。

1569136497379

图1 从上往下,从左往右分别是原图、红色通道、红色通道直方图、绿色通道、绿色通道直方图、蓝色通道、蓝色通道直方图

2.2 分析

如图1所示,如果只看图片可以明显的感觉绿色分量的能量强度明显强于红色分量和蓝色分量,而红色分量强于蓝色分量,能量强度顺序为:绿色>红色>蓝色。但是查看直方图可以得出,绿色能量强度最高,蓝色次之,红色最弱,能量强度顺序为:绿色>蓝色>红色。查找资料分析如下:

  • 红色为暖色调,在差不多同等能量强度下,人眼容易觉得红色光更强
  • 对于树叶来说,绿色和蓝色为其主色调

三、HSI空间

3.1 转换公式

HIS彩色空间正是为了适应人眼对颜色的感知和描述发展的颜色模型。它是开发基于彩色描述的图像处理方法的理想工具,这个模型利用色调(H),饱和度(S),强度(I)来描述色彩。其中HSI彩色模型和RGB彩色模型转换公式如下所示:

色调(H)

饱和度(S)

强度(I)

3.2 空间转换

依旧采取叶子作为分析目标,对HSI空间进行分析,为了方便显示,色调(H),饱和度(S),强度(I)都归一化到(0,255)之间,并对其做直方图分析。显示结果如下图2所示,代码见附录6.2。

1569140174282

图2 从上往下,从左往右分别是原图、色调(H)通道、色调(H)通道直方图、饱和度(S)通道、饱和度(S)通道直方图、强度(I)通道、强度(I)通道直方图

3.3 分析

对图2进行分析,结果如下:

  • 色调(H)比较集中,主要集中在绿色附近,符合叶子颜色
  • 饱和度(S)均值在0.5左右,图像呈现正太分布形状
  • 强度(I),能量主要集中在0~150,整体偏暗。

四、YUV空间

4.1 转换公式

YUV空间,其中“Y”表示明亮度,也就是灰阶值;而“U”和“V” 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V信号分量,那么这样表示的图像就是黑白灰度图像,非常适合兼容黑白电视机和彩色电视机。从RGB空间转换到YUV空间公式如下:

4.2 空间转换

依旧采取叶子作为分析目标,使用opencv从RGB空间转换到YUV空间,并进行直方图显示。显示结果如下,代码见附录6.3。

1569142467300

图3 从上往下,从左往右分别是原图、Y通道、Y通道直方图、U通道、U通道直方图、V通道、V通道直方图

4.3 分析

如图3所示,Y通道的能量和带宽比U和V通道都高。根据YUV的用途——视频的传输显示,Y通道占用了大量的带宽用于黑白图像显示,如果要显示彩色图像,只需要增加带宽开销较小的U、V通道即可。这样就很好的解决了黑白电视机和彩色电视机协议是否兼容的问题。

五、总体分析

  • RGB空间更加适合用于硬件显示。
  • HSI空间更加适合人对图像的描述。因为我们无法直观的从RGB分量上面得知该图像的具体颜色。
  • YUV空间适合用于图像的传输。

六、附录

6.1 RGB空间显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np

image = plt.imread("image/image1.jpg")
imageRGB = cv2.resize(image,(image.shape[1],image.shape[0]))
imageRGB = np.uint8(imageRGB)

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax1_img = np.copy(imageRGB[:,:,:])
ax1_img[:,:,1] = 0
ax1_img[:,:,2] = 0
plt.imshow(ax1_img)
plt.sca(ax1)

ax2 = fig.add_subplot(222)
ax2_img = np.copy(imageRGB[:,:,:])
ax2_img[:,:,0] = 0
ax2_img[:,:,2] = 0
plt.imshow(ax2_img)
plt.sca(ax2)

ax3 = fig.add_subplot(223)
ax3_img = np.copy(imageRGB[:,:,:])
ax3_img[:,:,0] = 0
ax3_img[:,:,1] = 0
plt.imshow(ax3_img)
plt.sca(ax3)

ax4 = fig.add_subplot(224)
plt.imshow(imageRGB)
plt.sca(ax4)

plt.show()

6.2 HSI转换并显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np

def rgbtohsi(rgb_lwpImg):
rows = int(rgb_lwpImg.shape[0])
cols = int(rgb_lwpImg.shape[1])
b, g, r = cv2.split(rgb_lwpImg)
# 归一化到[0,1]
b = b / 255.0
g = g / 255.0
r = r / 255.0
hsi_lwpImg = rgb_lwpImg.copy()
H, S, I = cv2.split(hsi_lwpImg)
for i in range(rows):
for j in range(cols):
num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))
den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))
theta = float(np.arccos(num/den))

if den == 0:
H = 0
elif b[i, j] <= g[i, j]:
H = theta
else:
H = 2*3.14169265 - theta

min_RGB = min(min(b[i, j], g[i, j]), r[i, j])
sum = b[i, j]+g[i, j]+r[i, j]
if sum == 0:
S = 0
else:
S = 1 - 3*min_RGB/sum

H = H/(2*3.14159265)
I = sum/3.0
# 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
hsi_lwpImg[i, j, 0] = H*255
hsi_lwpImg[i, j, 1] = S*255
hsi_lwpImg[i, j, 2] = I*255
return hsi_lwpImg


image = plt.imread("image/image2.jpg")
imageRGB = rgbtohsi(image[:,:,[2,1,0]])

fig = plt.figure()
fig.add_subplot(421)
plt.imshow(image)

fig.add_subplot(423)
ax1_img = np.copy(imageRGB[:,:,:])
ax1_img[:,:,1] = 0
ax1_img[:,:,2] = 0
plt.imshow(ax1_img[:,:,0],cmap="gray")
cv2.imshow("1",ax1_img[:,:,0])

fig.add_subplot(424)
plt.hist(ax1_img[:,:,0].ravel(), 256, [0, 256])

fig.add_subplot(425)
ax2_img = np.copy(imageRGB[:,:,:])
ax2_img[:,:,0] = 0
ax2_img[:,:,2] = 0
plt.imshow(ax2_img[:,:,1],cmap="gray")
cv2.imshow("2",ax2_img[:,:,1])

fig.add_subplot(426)
plt.hist(ax2_img[:,:,1].ravel(), 256, [0, 256])

fig.add_subplot(427)
ax3_img = np.copy(imageRGB[:,:,:])
ax3_img[:,:,0] = 0
ax3_img[:,:,1] = 0
plt.imshow(ax3_img[:,:,2],cmap="gray")
cv2.imshow("3",ax3_img[:,:,2])

fig.add_subplot(428)
plt.hist(ax3_img[:,:,2].ravel(), 256, [0, 256])

plt.pause(0.1)
cv2.waitKey(0)

6.3 YUV空间转换和显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np

image = plt.imread("image/image2.jpg")

imageRGB = cv2.cvtColor(image[:,:,[2,1,0]],cv2.COLOR_BGR2YUV)
fig = plt.figure()
fig.add_subplot(421)
plt.imshow(image)

fig.add_subplot(423)
ax1_img = np.copy(imageRGB[:,:,:])
ax1_img[:,:,1] = 0
ax1_img[:,:,2] = 0
plt.imshow(ax1_img[:,:,0],cmap="gray")
cv2.imshow("1",ax1_img[:,:,0])

fig.add_subplot(424)
plt.hist(ax1_img[:,:,0].ravel(), 256, [0, 256])

fig.add_subplot(425)
ax2_img = np.copy(imageRGB[:,:,:])
ax2_img[:,:,0] = 0
ax2_img[:,:,2] = 0
plt.imshow(ax2_img[:,:,1],cmap="gray")
cv2.imshow("2",ax2_img[:,:,1])

fig.add_subplot(426)
plt.hist(ax2_img[:,:,1].ravel(), 256, [0, 256])

fig.add_subplot(427)
ax3_img = np.copy(imageRGB[:,:,:])
ax3_img[:,:,0] = 0
ax3_img[:,:,1] = 0
plt.imshow(ax3_img[:,:,2],cmap="gray")
cv2.imshow("3",ax3_img[:,:,2])

fig.add_subplot(428)
plt.hist(ax3_img[:,:,2].ravel(), 256, [0, 256])

plt.pause(0.1)
cv2.waitKey(0)
-------------本文结束感谢您的阅读-------------
0%