<jupyter_start><jupyter_text>4. úkol - HDR, odhad odezvové funkce<jupyter_code>import exif
import cv2
import matplotlib.pyplot as plt
import glob
import numpy as np

# Doplňte jakékoliv další potřebné knihovny
# Funkce pro načtení obrázků a výpočty

def read_images(file_pattern, scale_percent = 5):
    files = glob.glob(file_pattern) # Načtení cest ke všem souborům dle daného vzoru

    # příprava listů
    imgs = []
    t = []

    # cyklus přes všechny soubory (obrázky v dané cestě)
    for file in files:
        tmp_img = cv2.imread(file, cv2.IMREAD_UNCHANGED) # Načtení obrázku
        width = int(tmp_img.shape[1] * scale_percent / 100) #nový rozměr po zmenšení dle dané hodnoty v %
        height = int(tmp_img.shape[0] * scale_percent / 100) #nový rozměr po zmenšení dle dané hodnoty v %
        dim = (width, height) #nový rozměr po zmenšení dle dané hodnoty v %
        imgs.append(cv2.resize(tmp_img, dim, interpolation = cv2.INTER_AREA).flatten()) # zmenšení obrázku a uložení do listu
        info = exif.Image(file) # Načtení EXIF z obrázku
        t.append(info.exposure_time) # Uložení času expozice do listu
    return dim, np.array(imgs), t # Návrat velikosti obrázků, pole s obrázky a vektoru časů expozic

def get_weights(Z, L):
    return np.interp(Z, [0, (L-1)/2, L-1], [0, 1, 0]).flatten() 

def bgr2rgb(bgr_image):
    b,g,r = cv2.split(bgr_image) # Rozdělení barevných kanálů
    return cv2.merge([r,g,b]) # Spojení v jiném pořadí a použití jako návratovou hodnotu funkce
dim, Z, t = read_images("./images/*.jpg") # Načtení, zmenšení a čtení doby expozice
w = get_weights(Z, L) # výpočet vah
lambda_ = 2 # koeficent trestu z aporušení hladkosti
# Získání indexů do polí pro práci s řídkými maticemi
t_ind, Z_ind = np.indices(Z.shape)
Z_ind.flatten()
t_vec = np.log(np.take(t, t_ind.flatten())) * w
def estimate_exposure(Z, w):
"""
Odhadněte ozáření a časy expozic z intenzit jednotlivých pixelů z více expozic.

Předpokládejte, že odezvová funkce f je identická funkce.

Z Intenzity pixelů, Z(j,i) je intenzita itého pixelu v jtém obrázku
w váhy
"""
    L = np.max(Z) + 1

    ### Zde napište Váš kód ZALOŽENÝ NA METODĚ POPSANÉ ZDE https://cw.fel.cvut.cz/wiki/courses/b4m33dzo/labs/3_hdr V PODKAPITOLE Exposure Estimation 

    
    E = np.zeros(Z.shape[1]);
    t = np.zeros(Z.shape[0]);
    
    return E, finv
def estimate_response(Z, t, w, lambda_):
"""
Odhadněte ozáření a inverzní odezvovou funkci z intenzit jednotlivých pixelů z více expozic a časů expozic.

Z Intenzity pixelů, Z(j,i) je intenzita itého pixelu v jtém obrázku
t časy expozic, t > 0.
w váhy
lambda_ keoficent trestu za porušení hladkosti
"""
    L = np.max(Z) + 1

    ### Zde napište Váš kód ZALOŽENÝ NA METODĚ POPSANÉ ZDE https://cw.fel.cvut.cz/wiki/courses/b4m33dzo/labs/3_hdr V PODKAPITOLE Response Function Estimation 

    
    E = np.zeros(Z.shape[1]);
    finv = np.zeros(L);
    
    return E, finv
E, finv = estimate_exposure(Z, w)
# Zde po přepočtu vykreslete odhadnuté časy expozic (t)
# Zde po chodných úpravách vykreslete výsledný obrázek (E)
E, finv = estimate_response(Z, t, w, lambda_)
# Zde po přepočtu vykreslete Inverse response function (finv)
# Zde po chodných úpravách vykreslete výsledný obrázek (E)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0973288302118514, 'fraction_numerical': 0.012281240405280933, 'mean_word_length': 3.7841409691629955, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 6, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '112848', 'license': 'MIT', 'n_tokens_mistral': 1474, 'n_tokens_neox': 1441, 'n_words': 377, 'path': 'src/lectures/05_HDR/HDR_assignment .ipynb', 'repo_name': 'CVUT-FS-12110/mpip', 'size': '3257'}