Skip to content

Commit

Permalink
planetaryimage -> stable rasterio library, displayImages()
Browse files Browse the repository at this point in the history
  • Loading branch information
cyschneck committed Apr 26, 2023
1 parent f8e0abf commit 836b557
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 12 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -647,16 +647,19 @@ pydar.returnLBLOptions()
## Use Downloaded Data
### displayImages()

Displays downloaded image .IMG files (unzipped from within the .ZIP files) and display all images in directory

```
displayImages(image_directory=None, fig_title=None, figsize_n=6, fig_dpi=120)
displayImages(image_directory=None, fig_title=None, cmap="gray", figsize_n=6, fig_dpi=120)
```

* **[REQUIRED]** image_directory (string): directory containing pydar_results with IMG file
* [OPTIONAL] fig_title (str): figure title, defaults to filename
* [OPTIONAL] cmap (str): optional colormaps ([see more options](https://matplotlib.org/stable/tutorials/colors/colormaps.html)), defaults to 'gray'
* [OPTIONAL] figsize_n (int): plot dimensions, defaults to 6x6
* [OPTIONAL] fig_dpi (int): plot dpi, defaults to 120

Displays downloaded image .IMG files (unzipped from within the .ZIP files) and display all images in directory
Requires a .LBL and .IMG file

```python
import pydar
Expand Down
16 changes: 9 additions & 7 deletions pydar/display_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import os

# External Python libraries (installed via pip install)
from planetaryimage import PDS3Image
import rasterio
import matplotlib.pyplot as plt

# Internal Pydar reference to access functions, global variables, and error handling
Expand All @@ -18,24 +18,24 @@
logger.addHandler(stream_handler)

#### DISPLAY ALL PDR IMAGES IN A DIRECTORY #############################
def displayImages(image_directory=None, fig_title=None, figsize_n=6, fig_dpi=120):
def displayImages(image_directory=None, fig_title=None, cmap="gray", figsize_n=6, fig_dpi=120):
# Display all images in the image directory specified
# plt.show() all imgs in a given directory

pydar.errorHandlingDisplayImages(image_directory=image_directory,
fig_title=fig_title,
cmap=cmap,
figsize_n=figsize_n,
fig_dpi=fig_dpi)

# Display all IMG files in directory
for filename in os.listdir(image_directory):
if 'IMG' in filename:
if 'LBL' in filename:
image_file = os.path.join("{0}/{1}".format(image_directory, filename))

logger.info("Displaying Image: {0}".format(image_file))

image = PDS3Image.open(image_file)
logger.debug("Displaying Dimensions: {0}".format(image.shape))
image = rasterio.open(image_file).read()
image = image[0,:,:]

fig = plt.figure(figsize=(figsize_n,figsize_n), dpi=fig_dpi)
if fig_title is None:
Expand All @@ -44,9 +44,11 @@ def displayImages(image_directory=None, fig_title=None, figsize_n=6, fig_dpi=120
plt.title(fig_title)
plt.xlabel("Pixels #")
plt.ylabel("Pixels #")
plt.imshow(image.image, cmap='gray')
plt.imshow(image, cmap=cmap)
plt.show()

# Log error to user if no image files given
if not any(".LBL" in sub for sub in os.listdir(image_directory)): # if directory files does not contain any .IMG files
logger.info("\nINFO: Unable to display images, {0} does not contain an LBL file\n".format(image_directory))
if not any(".IMG" in sub for sub in os.listdir(image_directory)): # if directory files does not contain any .IMG files
logger.info("\nINFO: Unable to display images, {0} does not contain an IMG file\n".format(image_directory))
6 changes: 5 additions & 1 deletion pydar/error_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ def errorHandlingConvertObservationNumberToFlybyID(flyby_observation_num=None):
logger.critical("\nCRITICAL ERROR, [flyby_observation_num]: Invalid flyby_observation_num, '{0}', choose from:\n{1}".format(flyby_observation_num, valid_observation_nums))
exit()

def errorHandlingDisplayImages(image_directory=None, fig_title=None, figsize_n=None, fig_dpi=None):
def errorHandlingDisplayImages(image_directory=None, fig_title=None, cmap=None, figsize_n=None, fig_dpi=None):
# Error Handling for Displaying Images from an Image Directory: displayImages()
if image_directory == None:
logger.critical("\nCRITICAL ERROR, [image_directory]: image_directory is required")
Expand All @@ -175,6 +175,10 @@ def errorHandlingDisplayImages(image_directory=None, fig_title=None, figsize_n=N
logger.critical("\nCRITICAL ERROR, [fig_title]: Must be a str, current type = '{0}'".format(type(fig_title)))
exit()

if cmap is not None and type(cmap) != str:
logger.critical("\nCRITICAL ERROR, [cmap]: Must be a str, current type = '{0}'".format(type(cmap)))
exit()

if type(figsize_n) != int:
logger.critical("\nCRITICAL ERROR, [figsize_n]: Must be a int, current type = '{0}'".format(type(figsize_n)))
exit()
Expand Down
10 changes: 10 additions & 0 deletions pydar/pytests/test_display_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@ def test_displayImages_figureTitleInvalidTypes(caplog, fig_title_invalid, fig_ti
assert log_record.levelno == logging.CRITICAL
assert log_record.message == "\nCRITICAL ERROR, [fig_title]: Must be a str, current type = '{0}'".format(fig_title_error_output)

@pytest.mark.parametrize("cmap_invalid, cmap_error_output", invalid_non_str_options)
def test_displayImages_cmapInvalidTypes(caplog, cmap_invalid, cmap_error_output):
# Test:
with pytest.raises(SystemExit):
pydar.displayImages(image_directory="pydar_results/testing", cmap=cmap_invalid)
log_record = caplog.records[0]
assert log_record.levelno == logging.CRITICAL
assert log_record.message == "\nCRITICAL ERROR, [cmap]: Must be a str, current type = '{0}'".format(cmap_error_output)

@pytest.mark.parametrize("figsize_n_invalid, figsize_n_error_output", invalid_non_int_options)
def test_displayImages_figureSizeInvalidTypes(caplog, figsize_n_invalid, figsize_n_error_output):
# Test:
Expand Down Expand Up @@ -89,4 +98,5 @@ def test_displayImages_figureDPIInvalidRange(caplog):
log_record = caplog.records[0]
assert log_record.levelno == logging.CRITICAL
assert log_record.message == "\nCRITICAL ERROR, [fig_dpi]: fig_dpi must be greater than 1, current value = '0'"

## displayImages() #####################################################
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ beautifulsoup4==4.11.1
matplotlib==3.1.0
pandas==1.5.2
pdr==0.7.3
planetaryimage==0.5.0
pyproj==3.4.1
pytest==7.2.2
rasterio==1.3.6
urllib3==1.26.9
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
"matplotlib>=3.1.0",
"pandas>=1.5.2",
"pdr>=0.7.3",
"planetaryimage>=0.5.0",
"pyproj>=3.4.1",
"pytest>=7.2.2",
"rasterio>=1.3.6",
"urllib3>=1.26.9"
],
python_requires='>=3.9'
Expand Down

0 comments on commit 836b557

Please sign in to comment.