You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.2 KiB
Python

from pathlib import Path
import pandas as pd
import os
os.chdir(Path(__file__).parent.resolve())
from utils import datenum_to_datetime, RegisteredImage
import openpyxl
import scipy.io as sio
from PIL import Image, ImageDraw
'''
SCRIPT LOGIC
For each site in Images Parent Directory:
Iterate through years in reverse:
Iterate through images names (dates) in reverse:
Check if image name in 'Registered'?
If not, tag and save
If yes, skip to the next site
'''
#-----------------------------------------------------------------------------#
# Update this file path for Image Tagging - Tide Data
# Example: images_dir = '/Users/admin/OneDrive - UNSW/My files/CoastSnap/'
code_images_dir = str(Path(os.getcwd()).parent)
sites_csv_path = os.path.join(code_images_dir, "coastsnap_sites.csv")
# RETRIEVE IMAGES PARENT DIRECTORY IN coastsnap_sites.csv
coastsnap_sites_csv = pd.read_csv(sites_csv_path)
images_parent_dir = coastsnap_sites_csv.parent_directory[0]
images_dir = os.path.join(images_parent_dir, "Images")
#-----------------------------------------------------------------------------#
def get_site_tide_data(images_parent_dir, site):
# Retrieve tide data for the given site
db = openpyxl.load_workbook(images_parent_dir + "/Database/CoastSnapDB.xlsx")
beach_data = db[site]
tide_filename = beach_data["B24"].value
if tide_filename == 'NO_TIDE.mat':
return False
mat_path = images_parent_dir + '/Tide Data/' + tide_filename
mat = sio.loadmat(mat_path)
tide_dict = mat['tide']
ts = tide_dict[0][0] # Format of tide/time Matlab data is gross
tt = list(ts[0]) # ts[0] = tides, ts[1] = times, ts[2] =
print(site + ": " +"Loading tide data... (this may take half a minute)")
tide_times = [datenum_to_datetime(i) for i in tt] # THIS STEP TAKES A LONG TIME
return tide_times, ts
def tag_image(image2tag):
image = Image.open(image2tag.pathname)
draw = ImageDraw.Draw(image)
image2tag.get_dimensions()
# White Text Box
rect_height = image2tag.height/20
# Create white text box
draw.rectangle((0, 0, image2tag.width, rect_height), fill='white')
# Tag image with text
draw.text((20, rect_height/4),image2tag.tag, font = image2tag.font, fill=(0, 0, 0))
registered_path_wrong = image2tag.pathname[:-4] + '_registered.jpg'
registered_path = registered_path_wrong.replace('Photoshop', 'Registered')
image = image.convert('RGB')
image.save(registered_path)
image2tag = None #initialize this here
for site in os.listdir(images_dir): # Loop through SITES
i=0
site_complete = False # A flag to stop tagging images when found
tide_data = False
font = None
photoshop_path = images_dir +'/'+ site + '/Photoshop'
try: # Check if site contains 'Processed' directory
years_list = os.listdir(photoshop_path)
years_list.reverse()
except:
continue
for year in years_list: # Loop through YEARS
if site_complete: break
year_path = photoshop_path + '/' + year
image_list = os.listdir(year_path)
image_list.reverse()
for image_filename in image_list: # Loop through IMAGES
registered_year_path = year_path.replace('Photoshop', 'Registered')
registered_image_path = registered_year_path + '/' + image_filename[:-4] + '_registered.jpg'
if site not in image_filename: # Check the filename has the site in it
continue
if os.path.isfile(registered_image_path): # Image already tagged. Go to next site.
site_complete = True;
if i == 0:
print(site + ": " + str(i) + " images tagged")
elif image2tag and image2tag.tide:
print(site + ": " + str(i) + " images tagged with tide")
else:
print(site + ": " + str(i) + " images tagged no tide")
break
else: # Image not tagged. Tag it.
if not os.path.exists(registered_year_path): # Chech that registered/year directory exists
os.makedirs(registered_year_path) # if not, create it
i += 1
pathname = os.path.join(year_path, image_filename)
image2tag = RegisteredImage(pathname, image_filename) # Create image object
if i == 1: # Retrieve Tide Data once for each site
site_tide_data, ts = get_site_tide_data(images_parent_dir, site)
font = image2tag.get_font()
if site_tide_data:
image2tag.get_tide(site_tide_data, ts)
image2tag.create_tag()
tag_image(image2tag)
if not site_complete:
if i == 0:
print(site + ": " + str(i) + " images tagged")
elif image2tag.tide:
print(site + ": " + str(i) + " images tagged with tide")
else:
print(site + ": " + str(i) + " images tagged no tide")