Source code for hdrstats.image

# -*- coding: utf-8 -*-
# Copyright (c) 2020 Stephen Wasilewski
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================

"""dat parsing and statistical analysis."""
import numpy as np

import clasp.script_tools as cst


[docs]def img_size(img): """returns x and y pixel dimensions of image""" geti = 'getinfo -d {}'.format(img) dims = cst.pipeline([geti]).split() y = int(dims[2]) x = int(dims[4]) return x, y
[docs]def get_omegas(image, xres, yres): """get solid angle of each pixel in image""" pcomb = f"pcomb -e 'lo=S(1)' {image}" pval = "pvalue -o -H -h -d -b" imdat = [float(i) for i in cst.pipeline([pcomb, pval]).strip().split()] imarray = np.reshape(imdat, (yres, xres)).swapaxes(0, 1) return np.flip(imarray, 1)
[docs]def get_cos(res): """generate a 2D array of cos(r) values""" a = np.linspace(-np.pi/2, np.pi/2, res) x, y = np.meshgrid(a, a, sparse=True) z = np.cos(np.sqrt(np.square(x) + np.square(y))) z[z < 0] = 0 return z
[docs]def read_im_to_array(image, xres, yres, color=False, prepipe=None): """read hdr image to numpy array prepipe should be a format string correctly placing image, eg: "pcomb -s .8 {} | pfilt -1 -e 1 -x 500 -y 500" """ pval = "pvalue -o -H -h -d " if not color: pval += "-b " if prepipe is not None: imdat = [float(i) for i in cst.pipeline([prepipe.format(image), pval]).strip().split()] else: imdat = [float(i) for i in cst.pipeline([pval + image]).strip().split()] if color: imarray = np.reshape(imdat, (yres, xres, 3)).swapaxes(0, 1) else: imarray = np.reshape(imdat, (yres, xres)).swapaxes(0, 1) return np.flip(imarray, 1)
[docs]def img_2_stats(img, res=None, omegas=None, cos=None, scale=179, hblur=False): """read image and return Ev and luminance ratio""" if hblur: imarray = read_im_to_array(img, res, res, prepipe='humanblur.csh {}') else: imarray = read_im_to_array(img, res, res) wlum = imarray * omegas * scale inv = cos > 0 illum = np.sum(wlum * cos) alum = np.sum(wlum[inv])/(np.pi * 2) alum2 = np.sum((np.square(imarray * scale) * omegas)[inv])/(np.pi * 2) l2l2 = alum2/np.square(alum) # std (with samples weighted by omega) std = np.sqrt(np.average(np.square((imarray * scale)[inv] - alum), weights=omegas[inv])) # absolute deviation ad = np.average(np.abs((imarray * scale)[inv] - alum), weights=omegas[inv]) return illum, l2l2, std, ad
[docs]def evalglare(img, options="", detail=True, caperr=False, **kwargs): """return dict of evalglare output""" if detail: options += " -d" output = cst.pipeline([f'evalglare {options} {img}'], caperr=caperr) if caperr: output = output[0] lines = output.splitlines() calchdr = lines[-1].split(':')[0].strip().split(',') calcs = lines[-1].split(':')[-1].strip().split() result = dict() for h, c in zip(calchdr, calcs): result[h] = float(c) if detail: srcs = lines[1:-1] srchdr = lines[0].split()[2:] result['srcs'] = [] for src in srcs: src = src.split()[1:] srcstats = dict() for h, c in zip(srchdr, src): srcstats[h] = float(c) result['srcs'].append(srcstats) result['T1'], result['T2'] = dgp_comp(result['srcs']) return result
[docs]def dgp_comp(srcs): Ls = np.square(np.array([i['L_s'] for i in srcs])) omega = np.array([i['Omega_s'] for i in srcs]) Ev = srcs[0]['E_vert'] P = np.array([i['Posindx'] for i in srcs]) if np.sum(Ls) > 0: t2 = np.round(.0918*np.log10(np.sum(Ls*omega/(np.square(P)))/ np.power(Ev,1.87)+1), 6) else: t2 = 0 t1 = np.round(.0000587*Ev, 6) return t1, t2