在这里我们将使用色彩空间、形状分析及特征构造
1.RGB to HSV
首先可视化标准化后的图像及其HSV颜色空间中的三个通道。
定义一个整数变量image_num
,表示要可视化的图像在训练集中的索引。然后,从标准化后的训练集Standardized_Train_List
中获取该图像及其对应的标签,并将它们分别存储在变量test_im
和test_label
中。
接下来,使用OpenCV库的cvtColor()
函数将RGB格式的图像转换为HSV格式,并将其存储在变量hsv
中。然后,分别从hsv
数组中获取H、S、V三个通道的数组,并将它们分别存储在变量h
、s
和v
中。
最后,使用matplotlib库创建一个包含四个子图的图像窗口,分别显示原始的标准化后的图像、H通道、S通道和V通道,并添加相应的标题。其中,使用imshow()
函数显示图像,使用cmap='gray'
参数设置为灰度颜色映射。
Standardized_Train_List = standardize(IMAGE_LIST)
image_num = 0
test_im = Standardized_Train_List[image_num][0]
test_label = Standardized_Train_List[image_num][1]
#convert to hsv
hsv = cv2.cvtColor(test_im, cv2.COLOR_RGB2HSV)
# Print image label
print('Label [red, yellow, green]: ' + str(test_label))
h = hsv[:,:,0]
s = hsv[:,:,1]
v = hsv[:,:,2]
# Plot the original image and the three channels
_, ax = plt.subplots(1, 4, figsize=(20,10))
ax[0].set_title('Standardized image')
ax[0].imshow(test_im)
ax[1].set_title('H channel')
ax[1].imshow(h, cmap='gray')
ax[2].set_title('S channel')
ax[2].imshow(s, cmap='gray')
ax[3].set_title('V channel')
ax[3].imshow(v, cmap='gray')
输出结果:
HSV即色相、饱和度、明度(英语:Hue, Saturation, Value),又称HSB:
色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),亮度(L),取0-100%。
2.创建图像特征
函数create_feature()
用于计算图像的基本亮度特征。输入参数rgb_image
是一张RGB格式的图像,函数会将其转换为HSV格式,并计算HSV颜色空间中V通道的平均值作为亮度特征。
def create_feature(rgb_image):
'''
Basic brightness feature
rgb_image : a rgb_image
'''
hsv = cv2.cvtColor(rgb_image,cv2.COLOR_RGB2HSV)
sum_brightness = np.sum(hsv[:,:,2])
area = 32*32
avg_brightness = sum_brightness / area#Find the average
return avg_brightness
函数high_saturation_pixels()
用于计算图像的高饱和度像素的红色和绿色通道的平均值。输入参数rgb_image
是一张RGB格式的图像,函数会将其转换为HSV格式,并遍历32*32个像素点,找到饱和度大于阈值threshold
的像素点,然后计算这些像素点的红色和绿色通道的平均值。如果没有找到符合条件的像素点,则调用函数highest_sat_pixel()
查找最饱和度的像素点,并判断该像素点的红色和绿色通道哪个更高。
def high_saturation_pixels(rgb_image,threshold=80):
'''
Returns average red and green content from high saturation pixels
Usually, the traffic light contained the highest saturation pixels in the image.
The threshold was experimentally determined to be 80
'''
high_sat_pixels = []
hsv = cv2.cvtColor(rgb,cv2.COLOR_RGB2HSV)
for i in range(32):
for j in range(32):
if hsv[i][j][1] > threshold:
high_sat_pixels.append(rgb_image[i][j])
if not high_sat_pixels:
return highest_sat_pixel(rgb_image)
sum_red = 0
sum_green = 0
for pixel in high_sat_pixels:
sum_red+=pixel[0]
sum_green+=pixel[1]
# use sum() instead of manually adding them up
avg_red = sum_red / len(high_sat_pixels)
avg_green = sum_green / len(high_sat_pixels)*0.8
return avg_red,avg_green
def highest_sat_pixel(rgb_image):
'''
Finds the highest saturation pixels, and checks if it has a higher green
or a higher red content
'''
hsv = cv2.cvtColor(rgb_image,cv2.COLOR_RGB2HSV)
s = hsv[:,:,1]
x,y = (np.unravel_index(np.argmax(s),s.shape))
if rgb_image[x,y,0] > rgb_image[x,y,1]*0.9:
return 1,0 #red has a higher content
return 0,1
这两个函数都返回一个包含特征信息的元组,其中第一个元素是亮度特征或红色通道的平均值,第二个元素是绿色通道的平均值。