Spaces:
Sleeping
Sleeping
| # Written by Dr Daniel Buscombe, Marda Science LLC | |
| # | |
| # MIT License | |
| # | |
| # Copyright (c) 2022, Marda Science LLC | |
| # | |
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |
| # of this software and associated documentation files (the "Software"), to deal | |
| # in the Software without restriction, including without limitation the rights | |
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| # copies of the Software, and to permit persons to whom the Software is | |
| # furnished to do so, subject to the following conditions: | |
| # | |
| # The above copyright notice and this permission notice shall be included in all | |
| # copies or substantial portions of the Software. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| # SOFTWARE. | |
| import gradio as gr | |
| import os | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| # from skimage.transform import resize | |
| plt.style.use('fivethirtyeight') | |
| from funcs import * | |
| #================================================================ | |
| def do_dgs(input_img): | |
| maxscale=5 #20 | |
| verbose=True | |
| x=0 #-0.5 | |
| resolution=1 | |
| w=input_img.shape[0] | |
| h=input_img.shape[1] | |
| # input_img = resize(input_img, (int(w/2), int(h/2)), preserve_range=True, clip=True) | |
| # resolution = 2 | |
| data_out = dgs(input_img, resolution, maxscale, verbose, x) | |
| ## parse out dict into three separate dictionaries | |
| stats = dict(list(data_out.items())[:4]) | |
| percentiles = dict(list(data_out.items())[4:6]) | |
| freqs_bins = dict(list(data_out.items())[6:]) | |
| if resolution!=1: | |
| freqs_bins['grain size bins']*=resolution | |
| percentiles['percentile_values']*=resolution | |
| for k in stats.keys(): | |
| stats[k] = stats[k]*resolution | |
| tmp = list(stats.keys()) | |
| d = {} | |
| for k in range(len(tmp)): | |
| d.update( {tmp[k]: str(stats[tmp[k]])} ) | |
| pd.DataFrame(data=d.values(), index=d.keys()).to_csv('stats.csv') | |
| tmp = list(percentiles.keys()) | |
| d2 = {} | |
| for k in range(len(tmp)): | |
| d2.update( {tmp[k]: str(percentiles[tmp[k]])} ) | |
| pd.DataFrame(data=d2.values(), index=d2.keys()).to_csv('percentiles.csv') | |
| # write each to csv file | |
| pd.DataFrame.from_dict(freqs_bins).to_csv('freqs_bins.csv') | |
| # plt.clf() | |
| fig1=plt.figure(figsize=(4,4)) | |
| plt.plot(freqs_bins['grain size bins'], freqs_bins['grain size frequencies'], lw=2) | |
| plt.xlabel('Grain Size (pixels)') | |
| plt.ylabel('Frequency') | |
| plt.axvline(x=percentiles['percentile_values'][5], color="black", linestyle="--") | |
| plt.text(percentiles['percentile_values'][5], .1, 'd50') | |
| # plt.title('Grain Size Distribution') | |
| # plt.xlim(np.maximum(0,stats['mean grain size']-(2*stats['grain size sorting'])), stats['mean grain size']+(2*stats['grain size sorting'])) | |
| # plt.savefig('psd.png', dpi=300, bbox_inches='tight') | |
| # plt.clf() | |
| fig2=plt.figure(figsize=(4,4)) | |
| plt.imshow(input_img,cmap='gray') | |
| plt.plot([50, 50+stats['mean grain size']], [50, 50], 'r') | |
| try: | |
| plt.xlim(0,200) | |
| plt.ylim(0,200) | |
| except: | |
| pass | |
| plt.axis("off") | |
| out = {} | |
| out.update( {'mean grain size': float(str(stats['mean grain size'])[:4]) } ) | |
| out.update( {'grain size sorting': float(str(stats['grain size sorting'])[:4]) } ) | |
| out.update( {'d16': float(str(percentiles['percentile_values'][2])[:4]) } ) | |
| out.update( {'d50': float(str(percentiles['percentile_values'][5])[:4]) } ) | |
| out.update( {'d84': float(str(percentiles['percentile_values'][7])[:4]) } ) | |
| return pd.DataFrame(data=out.values(), index=out.keys()).transpose(), fig1, fig2, 'stats.csv', 'percentiles.csv', 'freqs_bins.csv' | |
| title = "Digital Grain Size" | |
| description = "Upload an image of sediment. Download grain size stats. Clear between images. See https://github.com/dbuscombe-usgs/pyDGS. May take a very long time for large images" | |
| examples= [[l] for l in glob('examples/*.jpg')] | |
| inp = gr.Image(label='Upload images one-by-one') | |
| out1 = gr.Dataframe(label='Summary statistics', headers=["mean (px)", "sorting (px)", "d16 (px)", "d50 (px)", "d84 (px)"], type='pandas') | |
| #out1 = gr.outputs.Image(type='numpy') | |
| out2a = gr.Plot(label='Grain Size Distribution', type='auto') #'matplotlib') | |
| out2b = gr.Plot(label='Red Line = Mean Grain Length', type='auto') #'matplotlib') | |
| out4 = gr.File(label='Click to download grain size summary stats (px)') | |
| out5 = gr.File(label='Click to download grain size percentiles (px)') | |
| out6 = gr.File(label='Click to download grain size distribution: bins (px) and frequencies') | |
| Segapp = gr.Interface(do_dgs, inp, [out1, out2a, out2b, out4, out5, out6], title = title, description = description, examples=examples) | |
| Segapp.launch(enable_queue=True) | |