版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
上一篇写的没有任何问题,功能完全Ok,但是一旦需要校正的图片分辨率比较大,比如2320*3088会明显的感到很慢,虽然文件本身不大才600多k,但是分辨率高啊,之前的方法是三个循环去给像素挨个赋值,这绝对是假python代码好不好,哈哈!测试了一下需要7s多,这个结果也只有学校实验室里能接受吧。把三个过程需要时间分别打印出来后发现调整像素最耗时,所以果断改进这里。
没优化前用时:
优化后用时:
总共提高了11.32/0.21 = 53.9倍,这速度 不用我过多描述了
主要修改了像素赋值的操作,从三个for循环变成了numpy的计算
# 自动色阶亮度
def AutoBrightness(raw_img):
rgb_min_output = 0
rgb_max_output = 255
channel_list = []
dst = raw_img.copy()
# 计算各通道的直方图,确定输入的最大/小值
channel_min_input = [np.min(raw_img[:, :, c]) for c in range(3)]
channel_max_input = [np.max(raw_img[:, :, c]) for c in range(3)]
hist_list = []
for i in range(3):
hist_c, bin_edges = np.histogram(raw_img[:, :, i], bins=256, range=(0, 256), density=True)
hist_list.append(hist_c)
hist_array = np.array(hist_list)
start = time.time()
# 计算各通道的最大/最小值
for c in range(3):
sum = 0
for index, element in enumerate(hist_array[c]):
sum += element
if sum > 0.99:
channel_max_input[c] = index
break
sum = 0
for i in range(len(hist_array[c]) - 1, -1, -1):
sum += hist_array[c][i]
if sum > 0.99:
channel_min_input[c] = i
break
end = time.time()
print('计算通道值, 用时:' + str(end - start))
try:
start = time.time()
# 计算各值的输出值
for i in range(3):
channel = [0] * (channel_max_input[i] + 1)
# channel = [0] * (channel_max_input[i] - channel_min_input[i] + 1)
for x in range(channel_min_input[i], channel_max_input[i] + 1):
output = rgb_min_output + (x - channel_min_input[i]) / (channel_max_input[i] - channel_min_input[i]) * (rgb_max_output - rgb_min_output) + 0.5
channel[x] = output
channel_list.append(np.array(channel))
end = time.time()
print('计算输出值, 用时:' + str(end - start))
start = time.time()
# 图像色阶调整
dst = raw_img.copy()
for c in range(3):
dst[raw_img[:,:,c] > channel_max_input[c]] = 255
dst[:,:,c] = channel_list[c][dst[:,:,c]]
end = time.time()
print('调整, 用时:' + str(end - start))
except Exception as e:
dst = raw_img.copy()
return dst