需求:
不同的图像有不同的明亮等级,现有文件夹a,要将a中的图像(若干张)根据图像的明亮等级分为0-10,且自动分配到不同的文件夹中;如下图所示,图1为过度黑暗场景,图2为明亮场景;
主要工作:
将RGB到YUV空间的变化,计算Y值,并将Y值归一化,根据得到的等级进行分类;
文件目录:
illumination_test_images文件夹:存放需要分类的图像;
illumination-level.txt:用来存放每张图像的明亮等级;
illumination-test.py:主要执行文件;
resuts文件夹:代表着不同的光照等级,illumination_test_images文件夹中的图像会分配到以下11个文件夹中;
0文件夹:子文件夹
1文件夹:子文件夹
2文件夹:子文件夹
......
10文件夹:子文件夹
illumination-test.py代码:
import os
import sys
import cv2
import shutil
def getTheBright(path):
"""
求取图像的亮度值
:param path: 输入图像路径
:return: 返回该图像亮度值
"""
img=cv2.imread(path)
b, g, r = cv2.split(img)
avg_b = 0
avg_g = 0
avg_r = 0
sum_b = 0
sum_g = 0
sum_r = 0
for i in range(0, b.shape[0]):
for j in range(0, b.shape[1]):
sum_b += b[i][j]
sum_g += g[i][j]
sum_r += r[i][j]
avg_b = int(sum_b/b.shape[0]/b.shape[1])
avg_g = int(sum_g/g.shape[0]/g.shape[1])
avg_r = int(sum_r/r.shape[0]/r.shape[1])
y = int(0.3*avg_r+0.59*avg_g+0.11*avg_b)
return y
def getTheYvalue():
"""
获得文件夹下所有图像的Y值
:return:
"""
original_path = "./illumination_test_images/"
files = os.listdir(original_path)
all_Y = []
fp = open("./illumination-level.txt", "w")
for i in range(0, len(files)):
y = getTheBright(original_path+files[i])
print(y)
all_Y.append(y)
fp.write(str(y)+"\n")
fp.close()
def readTextGetYvalue():
"""
得到txt文件中的所有Y值
:return:
"""
fp = open("./illumination-level.txt","r+")
Y = fp.readlines()
y_value = []
for line in Y:
line = line.rstrip("\n")
y_value.append(int(line))
print(y_value)
max_y = max(y_value)
min_y = min(y_value)
print(max_y)
print(min_y)
for i in range(len(y_value)):
y_value[i] = int((y_value[i]-min_y)/(max_y-min_y)*10)
print(y_value)
return y_value
def moveTheOriImageToRightIllumination():
"""
根据illumination-level.txt中的结果将illumination_test_images中的图像分配到0-10种亮度等级中
:return:
"""
y_value = readTextGetYvalue()
ori_path = "./illumination_test_images/"
dst_path = "./results/"
img_files = os.listdir(ori_path)
for i in range(0, len(y_value)):
print(i)
shutil.copy(ori_path+img_files[i], dst_path+str(y_value[i]))
if __name__ == '__main__':
getTheYvalue() # 获取图像亮度,写入illumination-level.txt
moveTheOriImageToRightIllumination() # 移动图像
执行后的results文件夹: