|
import numpy as np |
|
from fractions import Fraction |
|
import cv2 |
|
import numpy as np |
|
import exifread |
|
from exifread.utils import Ratio |
|
import struct |
|
import json |
|
import torch |
|
import time |
|
|
|
Temp = np.ones([1536,2048]).astype(np.float32) |
|
Timg = np.ones([768,1024,3]).astype(np.float32) |
|
|
|
def apply_gamma(x): |
|
|
|
x = x.copy() |
|
idx = x <= 0.0031308 |
|
x[idx] *= 12.92 |
|
x[idx == False] = (x[idx == False] ** (1.0 / 2.4)) * 1.055 - 0.055 |
|
return x |
|
|
|
def binning(img,data): |
|
|
|
if data['cfa_pattern'] == [0,1,1,2]: |
|
|
|
ch_R = img[0::2, 0::2] |
|
ch_G = (img[1::2, 0::2]+img[0::2,1::2])/2 |
|
ch_B = img[1::2, 1::2] |
|
out = np.dstack((ch_R, ch_G, ch_B)) |
|
|
|
if data['cfa_pattern'] == [2,1,1,0]: |
|
|
|
ch_R = img[1::2, 1::2] |
|
ch_G = (img[1::2, 0::2]+img[0::2,1::2])/2 |
|
ch_B = img[0::2, 0::2] |
|
out = np.dstack((ch_R, ch_G, ch_B)) |
|
|
|
return out |
|
|
|
def Four2One(img): |
|
Temp[0::2,0::2] = img[:,:,0] |
|
Temp[1::2,0::2] = img[:,:,1] |
|
Temp[0::2,1::2] = img[:,:,1] |
|
Temp[1::2,1::2] = img[:,:,2] |
|
|
|
return Temp |
|
|
|
def One2Four(Temp): |
|
Timg[:,:,0] = Temp[0::2,0::2] |
|
Timg[:,:,1] = (Temp[1::2,0::2]+Temp[0::2,1::2])/2 |
|
Timg[:,:,2] = Temp[1::2,1::2] |
|
|
|
return Timg |
|
|
|
|
|
def white_balance(demosaic_img, as_shot_neutral): |
|
if type(as_shot_neutral[0]) is Ratio: |
|
as_shot_neutral = ratios2floats(as_shot_neutral) |
|
|
|
as_shot_neutral = np.asarray(as_shot_neutral) |
|
|
|
if as_shot_neutral.shape == (3,): |
|
as_shot_neutral = np.diag(1. / as_shot_neutral) |
|
|
|
assert as_shot_neutral.shape == (3, 3) |
|
|
|
white_balanced_image = np.dot(demosaic_img, as_shot_neutral.T) |
|
white_balanced_image = np.clip(white_balanced_image, 0.0, 1.0) |
|
|
|
return white_balanced_image |
|
|
|
|
|
|
|
|
|
|
|
|
|
def apply_color_space_transform(demosaiced_image, color_matrix): |
|
xyz2cam = np.reshape(np.asarray(color_matrix), (3, 3)) |
|
|
|
xyz2cam = xyz2cam / np.sum(xyz2cam, axis=1, keepdims=True) |
|
|
|
cam2xyz = np.linalg.inv(xyz2cam) |
|
|
|
xyz_image = cam2xyz[np.newaxis, np.newaxis, :, :] * \ |
|
demosaiced_image[:, :, np.newaxis, :] |
|
xyz_image = np.sum(xyz_image, axis=-1) |
|
xyz_image = np.clip(xyz_image, 0.0, 1.0) |
|
return xyz_image |
|
|
|
|
|
|
|
|
|
|
|
def transform_xyz_to_srgb(xyz_image): |
|
xyz2srgb = np.array([[3.2404542, -1.5371385, -0.4985314], |
|
[-0.9692660, 1.8760108, 0.0415560], |
|
[0.0556434, -0.2040259, 1.0572252]]) |
|
|
|
|
|
xyz2srgb = xyz2srgb / np.sum(xyz2srgb, axis=-1, keepdims=True) |
|
|
|
srgb_image = xyz2srgb[np.newaxis, np.newaxis, :, :] * xyz_image[:, :, np.newaxis, :] |
|
srgb_image = np.sum(srgb_image, axis=-1) |
|
srgb_image = np.clip(srgb_image, 0.0, 1.0) |
|
return srgb_image |
|
|
|
|
|
|
|
|
|
def fix_orientation(image, orientation): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if type(orientation) is list: |
|
orientation = orientation[0] |
|
|
|
if orientation == "Horizontal(normal)": |
|
pass |
|
elif orientation == "Mirror horizonta": |
|
image = cv2.flip(image, 0) |
|
elif orientation == "Rotate 180": |
|
image = cv2.rotate(image, cv2.ROTATE_180) |
|
elif orientation == "Mirror vertical": |
|
image = cv2.flip(image, 1) |
|
elif orientation == "Mirror horizontal and rotate 270 CW": |
|
image = cv2.flip(image, 0) |
|
image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) |
|
elif orientation == "Rotate 90 CW": |
|
image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) |
|
elif orientation == "Mirror horizontal and rotate 90 CW": |
|
image = cv2.flip(image, 0) |
|
image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) |
|
elif orientation == "Rotate 270 CW": |
|
image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) |
|
|
|
return image |