Gamma correction

This commit is contained in:
Vladyslav Usenko 2019-07-12 10:31:38 +00:00
parent c4f73877b4
commit fd150bd231
1 changed files with 72 additions and 8 deletions

View File

@ -3,9 +3,8 @@
import sys import sys
import math import math
import os import os
import webp import cv2
import pandas as pd
import numpy as np import numpy as np
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
@ -14,20 +13,85 @@ dataset_path = sys.argv[1]
print(dataset_path) print(dataset_path)
timestamps = np.loadtxt(dataset_path + '/mav0/cam0/data.csv', usecols=[0], delimiter=',', dtype=np.int64) timestamps = np.loadtxt(dataset_path + '/mav0/cam0/data.csv', usecols=[0], delimiter=',', dtype=np.int64)
exposures = np.loadtxt(dataset_path + '/mav0/cam0/exposure.csv', usecols=[1], delimiter=',', dtype=np.int64) exposures = np.loadtxt(dataset_path + '/mav0/cam0/exposure.csv', usecols=[1], delimiter=',', dtype=np.int64).astype(np.float64) * 1e-6
pixel_avgs = list() pixel_avgs = list()
if timestamps.shape[0] != exposures.shape[0]: print("timestamps and exposures do not match")
imgs = []
# check image data. # check image data.
img_extensions = ['.png', '.jpg', '.webp']
for timestamp in timestamps: for timestamp in timestamps:
path = dataset_path + '/mav0/cam0/data/' + str(timestamp) path = dataset_path + '/mav0/cam0/data/' + str(timestamp)
img = webp.imread(dataset_path + '/mav0/cam0/data/' + str(timestamp) + '.webp') img = cv2.imread(dataset_path + '/mav0/cam0/data/' + str(timestamp) + '.webp', cv2.IMREAD_GRAYSCALE)[:,:,0]
imgs.append(img)
pixel_avgs.append(np.mean(img)) pixel_avgs.append(np.mean(img))
plt.plot(exposures, pixel_avgs) imgs = np.array(imgs)
plt.ylabel('Img Mean') print(imgs.shape)
plt.xlabel('Exposure') print(imgs.dtype)
num_pixels_by_intensity = np.bincount(imgs.flat)
print('num_pixels_by_intensity', num_pixels_by_intensity)
inv_resp = np.arange(num_pixels_by_intensity.shape[0], dtype=np.float64)
inv_resp[-1] = -1.0 # Use negative numbers to detect saturation
def opt_irradiance():
corrected_imgs = inv_resp[imgs] * exposures[:, np.newaxis, np.newaxis]
times = np.ones_like(corrected_imgs) * (exposures**2)[:, np.newaxis, np.newaxis]
times[corrected_imgs < 0] = 0
corrected_imgs[corrected_imgs < 0] = 0
denom = np.sum(times, axis=0)
idx = (denom != 0)
irr = np.sum(corrected_imgs, axis=0)
irr[idx] /= denom[idx]
irr[denom == 0] = -1.0
return irr
def opt_inv_resp():
generated_imgs = irradiance[np.newaxis, :, :] * exposures[:, np.newaxis, np.newaxis]
num_pixels_by_intensity = np.bincount(imgs.flat, generated_imgs.flat >= 0)
generated_imgs[generated_imgs < 0] = 0
sum_by_intensity = np.bincount(imgs.flat, generated_imgs.flat)
new_inv_resp = inv_resp
idx = np.nonzero(num_pixels_by_intensity > 0)
new_inv_resp[idx] = sum_by_intensity[idx] / num_pixels_by_intensity[idx]
new_inv_resp[-1] = -1.0 # Use negative numbers to detect saturation
return new_inv_resp
def print_error():
generated_imgs = irradiance[np.newaxis, :, :] * exposures[:, np.newaxis, np.newaxis]
generated_imgs -= inv_resp[imgs]
generated_imgs[imgs == 255] = 0
print(np.sum(generated_imgs**2))
for iter in range(5):
irradiance = opt_irradiance()
print_error()
inv_resp = opt_inv_resp()
print_error()
plt.figure()
plt.plot(inv_resp[:-1])
plt.ylabel('Irradiance Value')
plt.xlabel('Image Intensity')
plt.title('Inverse Responce Function')
plt.figure()
plt.imshow(irradiance)
plt.title('Irradiance Image')
plt.show() plt.show()