import numpy as np
import tensorflow as tf
import cv2 as cv
import os
import scipy.misc
import h5py

# Settings.
scale = 3
size_input = 33
size_label = 21
stride = 21
counter = 0
# data = np.zeros([size_input, size_input, 1, 1])
# label = np.zeros([size_label, size_label, 1, 1])
data = []
label = []
padding = abs(size_input - size_label) / 2

# Source: https://stackoverflow.com/questions/29100722/equivalent-im2double-function-in-opencv-python
def im2double(im):
	info = np.iinfo(im.dtype) # Get the data type of the input image
	return im.astype(np.float32) / info.max # Divide all values by the largest possible value in the datatype

def revert(im):
	im = im * 255
	im[im > 255] = 255
	im[im < 0] = 0
	return im.astype(np.uint8)

def revert16(im):
	im = im * 65535
	im[im > 65535] = 65535
	return im.astype(np.uint16)

# Make sure the image shape is divisible by the scale factor. Also convert 3-channel image to 1-channel image.
def modcrop(image, scale=3):
	if image.shape[2] == 1:
		size = image.shape
		size -= np.mod(size, scale)
		image = image[0:size[0], 0:size[1]]
	else:
		size = image.shape[0:2]
		size -= np.mod(size, scale)
		image = image[0:size[0], 0:size[1], 0]
	return image

def modcrop_color(image, scale=3):
	size = image.shape[0:2]
	size -= np.mod(size, scale)
	image = image[0:size[0], 0:size[1], :]
	return image

# Load and preprocess the training images.
# dirpath = './Test/Set5/'
# for root, dirs, files in os.walk(dirpath):
# 	for file in files:
# 		# Read in image and convert to ycrcb color space.
# 		img = cv.imread(dirpath + file)
# 		# cv.imshow('image',img)
# 		# cv.waitKey(0)
# 		# cv.destroyAllWindows()
# 		img = cv.cvtColor(img, cv.COLOR_BGR2YCR_CB)
# 		img = im2double(img) # Only use the luminance value.

# 		# Create groundtruth and baseline image.
# 		im_label = modcrop(img)
# 		size = im_label.shape
# 		h = size[0]
# 		w = size[1]
# 		im_temp = scipy.misc.imresize(im_label, 1/scale, interp='bicubic')
# 		im_input = scipy.misc.imresize(im_temp, size, interp='bicubic')

# 		# Generate subimages for training.
# 		for x in range(0, h - size_input, stride):
# 			for y in range(0, w - size_input, stride):
# 				subim_input = im_input[x : x + size_input, y : y + size_input]
# 				subim_label = im_label[int(x + padding) : int(x + padding + size_label), int(y + padding) : int(y + padding + size_label)]
				
# 				subim_input = subim_input.reshape([size_input, size_input, 1])
# 				subim_label = subim_label.reshape([size_label, size_label, 1])

# 				data.append(subim_input)
# 				label.append(subim_label)
# 				counter += 1

# # Shuffle the data pairs.
# order = np.random.choice(counter, counter, replace=False)
# data = np.array([data[i] for i in order])
# label = np.array([label[i] for i in order])

# print('data shape is', data.shape)
# print('label shape is', label.shape)

# # Write to HDF5 file.
# savepath = os.path.join(os.getcwd(), 'checkpoint/test.h5')
# with h5py.File(savepath, 'w') as hf:
#     hf.create_dataset('data', data=data)
#     hf.create_dataset('label', data=label)