#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File        :   common.py    
@Contact     :   zpyovo@hotmail.com
@License     :   (C)Copyright 2018-2019, Lab501-TransferLearning-SCUT
@Description :

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2022/4/21 23:46   Pengyu Zhang      1.0         None
'''

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import time
import matplotlib.pyplot as plt

import numpy as np
import cv2
from matplotlib.ticker import NullLocator
from PIL import Image

'''色彩增益加权的AutoMSRCR算法'''
def singleScaleRetinex(img, sigma):
    retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))

    return retinex

def multiScaleRetinex(img, sigma_list):
    retinex = np.zeros_like(img)
    for sigma in sigma_list:
        retinex += singleScaleRetinex(img, sigma)

    retinex = retinex / len(sigma_list)

    return retinex

def automatedMSRCR(img, sigma_list):
    img = np.float64(img) + 1.0

    img_retinex = multiScaleRetinex(img, sigma_list)

    for i in range(img_retinex.shape[2]):
        unique, count = np.unique(np.int32(img_retinex[:, :, i] * 100), return_counts=True)
        for u, c in zip(unique, count):
            if u == 0:
                zero_count = c
                break

        low_val = unique[0] / 100.0
        high_val = unique[-1] / 100.0
        for u, c in zip(unique, count):
            if u < 0 and c < zero_count * 0.1:
                low_val = u / 100.0
            if u > 0 and c < zero_count * 0.1:
                high_val = u / 100.0
                break

        img_retinex[:, :, i] = np.maximum(np.minimum(img_retinex[:, :, i], high_val), low_val)

        img_retinex[:, :, i] = (img_retinex[:, :, i] - np.min(img_retinex[:, :, i])) / \
                               (np.max(img_retinex[:, :, i]) - np.min(img_retinex[:, :, i])) \
                               * 255

    img_retinex = np.uint8(img_retinex)

    return img_retinex

'''图像处理过程保存'''
def save_figure(fig_context,fig_name,res_code):
    fig = plt.figure()
    ax = fig.subplots(1)
    ax.imshow(fig_context, aspect='equal')
    result_path = os.path.join("tmp", '{}_{}_{}.jpg'.format(fig_name,res_code,time.time()))
    plt.axis("off")
    plt.gca().xaxis.set_major_locator(NullLocator())
    plt.gca().yaxis.set_major_locator(NullLocator())
    # filename = result_path.split("/")[-1].split(".")[0]
    plt.savefig(result_path, quality=95, bbox_inches="tight", pad_inches=0.0)
    plt.close()
    return result_path

def cropped_image(img, points, shift, size):
    x_min, y_min = points[0]
    x_max, y_max = points[1]

    x_min, y_min, x_max, y_max = int(x_min) - shift, int(y_min) - shift, int(x_max) + shift, int(y_max) + shift
    quarter_width = (x_max - x_min) // size
    quarter_height = (y_max - y_min) // size

    # 裁剪图像
    img = Image.fromarray(np.uint8(img))
    cropped_im = img.crop((x_min, y_min, x_min + quarter_width, y_min + quarter_height))


    return cropped_im