Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pretty image title #610

Merged
merged 8 commits into from
Sep 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions pocs/camera/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,8 @@ def take_observation(self, observation, headers=None, filename=None, *args, **kw
observation.exposure_list[image_id] = file_path

# Process the exposure once readout is complete
t = Thread(target=self.process_exposure, args=(metadata, observation_event, exposure_event))
t = Thread(target=self.process_exposure, args=(
metadata, observation_event, exposure_event))
t.name = '{}Thread'.format(self.name)
t.start()

Expand Down Expand Up @@ -238,12 +239,18 @@ def process_exposure(self, info, observation_event, exposure_event=None):
image_id = info['image_id']
seq_id = info['sequence_id']
file_path = info['file_path']
self.logger.debug("Processing {}".format(image_id))
exptime = info['exp_time']
field_name = info['field_name']

image_title = '{} [{}] {} {}'.format(field_name,
exptime,
seq_id.replace('_', ' '),
current_time(pretty=True))

try:
self.logger.debug("Extracting pretty image")
self.logger.debug("Processing {}".format(image_title))
img_utils.make_pretty_image(file_path,
title=info['field_name'],
title=image_title,
link_latest=info['is_primary'])
except Exception as e:
self.logger.warning('Problem with extracting pretty image: {}'.format(e))
Expand Down
74 changes: 46 additions & 28 deletions pocs/utils/images/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from glob import glob
from copy import copy
from dateutil import parser as date_parser

from pocs.utils import current_time
from pocs.utils import error
Expand Down Expand Up @@ -64,30 +65,32 @@ def crop_data(data, box_width=200, center=None, verbose=False):
return center


def make_pretty_image(fname, timeout=15, link_latest=False, **kwargs): # pragma: no cover
"""Make a pretty image
def make_pretty_image(fname, title=None, timeout=15, link_latest=False, **kwargs): # pragma: no cover
"""Make a pretty image.

This will create a jpg file from either a CR2 (Canon) or FITS file.

Notes:
See `$POCS/scripts/cr2_to_jpg.sh` for CR2 process.

Arguments:
fname (str): Name of image file, may be either .fits or .cr2.
timeout (int, optional): Timeout for image conversion in seconds,
default 15 seconds.
fname {str} -- Name of image file, may be either .fits or .cr2
title (None|str, optional): Title to be placed on image, default None.
timeout (int, optional): Timeout for conversion, default 15 seconds.
link_latest (bool, optional): If the pretty picture should be linked to
`$PANDIR/images/latest.jpg`, default False.
**kwargs: Additional keyword arguments passed to the conversion methods.
**kwargs {dict} -- Additional arguments to be passed to external script.

Returns:
str -- Filename of image that was created

str -- Filename of image that was created.
"""
assert os.path.exists(fname),\
warn("File doesn't exist, can't make pretty: {}".format(fname))

if fname.endswith('.cr2'):
pretty_path = _make_pretty_from_cr2(fname, timeout=timeout, **kwargs)
pretty_path = _make_pretty_from_cr2(fname, title=title, timeout=timeout, **kwargs)
elif fname.endswith('.fits'):
pretty_path = _make_pretty_from_fits(fname, **kwargs)
pretty_path = _make_pretty_from_fits(fname, title=title, **kwargs)
else:
warn("File must be a Canon CR2 or FITS file.")
return None
Expand All @@ -110,25 +113,42 @@ def make_pretty_image(fname, timeout=15, link_latest=False, **kwargs): # pragma
return pretty_path


def _make_pretty_from_fits(
fname=None, figsize=(10, 10 / 1.325), dpi=150, alpha=0.2, number=7, **kwargs):
def _make_pretty_from_fits(fname=None,
title=None,
figsize=(10, 10 / 1.325),
dpi=150,
alpha=0.2,
number_ticks=7,
clip_percent=99.9,
**kwargs):

with open_fits(fname) as hdu:
header = hdu[0].header
data = hdu[0].data
data = focus_utils.mask_saturated(data)
wcs = WCS(header)

title = kwargs.get('title', header.get('FIELD', 'Unknown'))
exp_time = header.get('EXPTIME', 'Unknown')
if not title:
field = header.get('FIELD', 'Unknown field')
exp_time = header.get('EXPTIME', 'Unknown exptime')
filter_type = header.get('FILTER', 'Unknown filter')

try:
date_time = header['DATE-OBS']
except KeyError:
# If we don't have DATE-OBS, check filename for date
try:
basename = os.path.splitext(os.path.basename(fname))[0]
date_time = date_parser.parse(basename).isoformat()
except Exception:
# Otherwise use now
date_time = current_time(pretty=True)

filter_type = header.get('FILTER', 'Unknown filter')
date_time = header.get('DATE-OBS', current_time(pretty=True)).replace('T', ' ', 1)
date_time = date_time.replace('T', ' ', 1)

percent_value = kwargs.get('normalize_clip_percent', 99.9)
title = '{} ({}s {}) {}'.format(field, exp_time, filter_type, date_time)

title = '{} ({}s {}) {}'.format(title, exp_time, filter_type, date_time)
norm = ImageNormalize(interval=PercentileInterval(percent_value), stretch=LogStretch())
norm = ImageNormalize(interval=PercentileInterval(clip_percent), stretch=LogStretch())

fig = plt.figure(figsize=figsize, dpi=dpi)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A reminder about my request that we have images (plots) that can display on both white and black backgrounds.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would normally happen with the fig.savefig method, which is part of the OO interface. I've added a note in #608.

Expand All @@ -140,7 +160,7 @@ def _make_pretty_from_fits(
ra_axis.set_axislabel('Right Ascension')
ra_axis.set_major_formatter('hh:mm')
ra_axis.set_ticks(
number=number,
number=number_ticks,
color='white',
exclude_overlapping=True
)
Expand All @@ -149,7 +169,7 @@ def _make_pretty_from_fits(
dec_axis.set_axislabel('Declination')
dec_axis.set_major_formatter('dd:mm')
dec_axis.set_ticks(
number=number,
number=number_ticks,
color='white',
exclude_overlapping=True
)
Expand All @@ -171,16 +191,14 @@ def _make_pretty_from_fits(
return new_filename


def _make_pretty_from_cr2(fname, timeout=15, **kwargs): # pragma: no cover
def _make_pretty_from_cr2(fname, title=None, timeout=15, **kwargs): # pragma: no cover
verbose = kwargs.get('verbose', False)

title = '{} {}'.format(kwargs.get('title', ''), current_time().isot)

solve_field = "{}/scripts/cr2_to_jpg.sh".format(os.getenv('POCS'))
cmd = [solve_field, fname, title]
script_name = os.path.join(os.getenv('POCS'), 'scripts', 'cr2_to_jpg.sh')
cmd = [script_name, fname]

if kwargs.get('primary', False):
cmd.append('link')
if title:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No default title?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, see PR description.

cmd.append(title)

if verbose:
print(cmd)
Expand Down
14 changes: 7 additions & 7 deletions scripts/cr2_to_jpg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ usage() {
# If exiftool is present this merely extracts the thumbnail from
# the CR2 file, otherwise use dcraw to create a jpeg.
#
# If present the CAPTION is added as a caption to the jpeg.
# If present the TITLE is added as a title to the jpeg.
##################################################
$ $(basename $0) FILENAME [CAPTION]
$ $(basename $0) FILENAME [TITLE]

Options:
FILENAME Name of CR2 file that holds jpeg.
CAPTION Optional caption to be placed on jpeg.
TITLE Optional tilte to be placed on jpeg.

Example:
scripts/cr2_to_jpg.sh /var/panoptes/images/temp.cr2 \"M42 (Orion's Nebula)\"
Expand All @@ -26,7 +26,7 @@ if [ $# -eq 0 ]; then
fi

FNAME=$1
CAPTION="${2}"
TITLE="${2}"

JPG="${FNAME%.cr2}.jpg"

Expand All @@ -45,12 +45,12 @@ else
fi
fi

if [[ -n "$CAPTION" ]]
if [[ -n "$TITLE" ]]
then
echo "Adding caption \"${CAPTION}\""
echo "Adding title \"${TITLE}\""
# Make thumbnail from jpg.
convert "${JPG}" -background black -fill red \
-font ubuntu -pointsize 60 label:"${CAPTION}" \
-font ubuntu -pointsize 60 label:"${TITLE}" \
-gravity South -append "${JPG}"
fi

Expand Down