Source code for asterism.core.image_processing.utils
"""
"""
# from __future__ import division, absolute_import, print_function
# from asterism.core.image_processing import geometry_transformation
# from asterism.core.image_processing import filter
#
# __author__ = 'andrea tramacere'
#
# def check_ImageTransformation(image_transformation):
# if isinstance(image_transformation,geometry_transformation.ImageTransform):
# pass
# else:
# raise RuntimeError ("the provided transformation is not an ImageTransform object")
#
# def check_ImageFilter(image_filter):
# if isinstance(image_filter,filter.ImageFilter):
# pass
# else:
# raise RuntimeError ("the provided filter is not an ImageFilter object")
#
#
import math as m
import numpy as np
[docs]def find_low_flux_sub_image(image,sub_block_frac_size=0.1,stack_average_max_id=1):
"""
This Functions splits an input image in a number of sub-blocks. Each sub-block has a
size that is a fraction of the input image size, give by the parameter `sub_block_frac_size`.
Sub-images are sorted according to their integrated flux. The lowest integrated flux sub-image
is returned, or the averaged/stacked `id_max` sub-images.
Parameters
----------
image : array-like:
The image from which to extract the sub_image for background estimation
sub_block_frac_size : float
The size of the sub_images relative to the input image size
stack_average_max_id : Optional[int] :
Number of lowest integrated flux images to stack/average
Returns
-------
sub_im : array-like
"""
print ("|bkg sub image shape-->", image.shape)
(y,x)=image.shape
sub_block_size=x*y*sub_block_frac_size
sub_block_side=m.sqrt(sub_block_size)
x_n=np.int(x/sub_block_side)
x_n=max(1,x_n)
y_n=np.int(y/sub_block_side)
y_n=max(1,y_n)
N_imgs=x_n*y_n
print("|sub block side",sub_block_side)
print("|N_imgs",N_imgs)
x_grid=np.arange(0,x-sub_block_side,sub_block_side)
y_grid=np.arange(0,y-sub_block_side,sub_block_side)
flux_arr=np.zeros((N_imgs,3))
ID=0
#import pylab as plt
for x_r in x_grid:
for y_r in y_grid:
flux=image[y_r:y_r+sub_block_side,x_r:x_r+sub_block_side].sum()
flux_arr[ID]=flux,x_r,y_r
ID+=1
flux_sorted_id=np.argsort(flux_arr[:,0])
flux_arr=flux_arr[flux_sorted_id]
x_r=flux_arr[0][1]
y_r=flux_arr[0][2]
sub_im=np.copy(image[y_r:y_r+sub_block_side,x_r:x_r+sub_block_side])
# sum and averages
if stack_average_max_id>1:
for sub_i in xrange(1,stack_average_max_id):
x_r=flux_arr[sub_i][1]
y_r=flux_arr[sub_i][2]
sub_im+=image[y_r:y_r+sub_block_side,x_r:x_r+sub_block_side]
return sub_im/float(stack_average_max_id)