上个版本有点小问题,只考虑了通道直方图的颜色范围分布,但是没有考虑分布的概率。如果,原图像某个通道的范围已经是[0,255]了,但是230-255之间的累积量特别少,这样还是要调整的。所谓修改了一下,彻底和PS的“自动色阶”效果一致了。图像整体偏色,读入后直接调用即可。
# 自动色阶亮度
def AutoBrightness(raw_img):
rgb_min_output = 0
rgb_max_output = 255
channel_list = []
# 计算各通道的直方图,确定输入的最大/小值
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)
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
# 计算各值的输出值
for i in range(3):
channel = [0] * (channel_max_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(channel)
# 图像色阶调整
dst = raw_img.copy()
for w in range(raw_img.shape[0]):
for h in range(raw_img.shape[1]):
for c in range(3):
try:
dst[w, h, c] = channel_list[c][raw_img[w, h, c]]
except Exception as ex:
if raw_img[w, h, c] > channel_max_input[c]:
dst[w, h, c] = 255
return dst
========================= 之前有问题版本======================
图像处理后发现整体偏暗,查看后发现色阶范围是0-100,需要自动调节一下,调整到0-255
代码很简单:
# 自动色阶亮度
def AutoBrightness(raw_img):
rgb_min_output = 0
rgb_max_output = 255
channel_list = []
for i in range(3):
channel_min_input = np.min(raw_img[:,:,i])
channel_max_input = np.max(raw_img[:,:,i])
channel = [0] * (channel_max_input - channel_min_input + 1)
for x in range(channel_min_input, channel_max_input + 1):
output = rgb_min_output + \
(x - channel_min_input) / \
(channel_max_input - channel_min_input) * \
(rgb_max_output - rgb_min_output) + 0.5
channel[x] = output
channel_list.append(channel)
dst = raw_img.copy()
for w in range(raw_img.shape[0]):
for h in range(raw_img.shape[1]):
for c in range(3):
dst[w,h,c] = channel_list[c][raw_img[w,h,c]]
return dst
原图:
调整后: