Spaces:
Sleeping
Sleeping
File size: 4,694 Bytes
cf0b6b1 15a7e90 162f3fb cf0b6b1 15a7e90 162f3fb 15a7e90 162f3fb cf0b6b1 162f3fb cf0b6b1 162f3fb cf0b6b1 162f3fb cf0b6b1 162f3fb cf0b6b1 162f3fb cf0b6b1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import numpy as np
import pandas as pd
from PIL import Image
import streamlit as st
from streamlit_drawable_canvas import st_canvas
from streamlit_image_select import image_select
from streamlit_sortables import sort_items
from py4matching import template as m
def expand2square(imgpath, background_color=(0, 0, 0)):
pil_img = Image.open(imgpath)
width, height = pil_img.size
if width == height:
return pil_img
elif width > height:
result = Image.new(pil_img.mode, (width, width), background_color)
result.paste(pil_img, (0, (width - height) // 2))
return result.resize((700, 700))
else:
result = Image.new(pil_img.mode, (height, height), background_color)
result.paste(pil_img, ((height - width) // 2, 0))
return result.resize((700, 700))
@st.cache_data
def loading_data(files):
imgs = []
imgs_names = []
imgs_dict = {}
for file in files:
image = expand2square(file)
imgs.append(image)
imgs_names.append(file.name)
imgs_dict[file.name] = image
return imgs, imgs_names, imgs_dict
if 'uploaded' not in st.session_state:
st.session_state['uploaded'] = False
images = st.sidebar.file_uploader("Upload here the images (max 4 imgs for demo version):",
type=["png", "jpg"], accept_multiple_files=True)
if len(images) > 0:
st.session_state['uploaded'] = True
imgs_path = []
imgs = []
else:
st.session_state['uploaded'] = False
if st.session_state['uploaded'] is True:
# Loading uploaded images and cache the data
imgs, imgs_path, imgs_dict = loading_data(images)
# Specify canvas parameters in application
drawing_mode = st.sidebar.selectbox(
"Drawing tool:", ("point", "line", "rect", "circle", "transform")
)
stroke_width = st.sidebar.slider("Stroke width: ", 1, 25, 3)
if drawing_mode == 'point':
point_display_radius = st.sidebar.slider("Point display radius: ", 1, 25, 3)
stroke_color = st.sidebar.color_picker("Stroke color hex: ")
bg_color = st.sidebar.color_picker("Background color hex: ", "#eee")
realtime_update = st.sidebar.checkbox("Update in realtime", False)
master_index = image_select("Uploaded images", imgs, captions=imgs_path, return_value="index")
# Create a canvas component
canvas_result = st_canvas(
fill_color="rgba(255, 165, 0, 0.3)", # Fixed fill color with some opacity
stroke_width=stroke_width,
stroke_color=stroke_color,
background_color=bg_color,
background_image= imgs[master_index], #expand2square(bg_image) if bg_image else expand2square("./IMG_02099.jpg"),
update_streamlit=realtime_update,
height=700,
width=700,
drawing_mode=drawing_mode,
point_display_radius=point_display_radius if drawing_mode == 'point' else 0,
key="canvas",
)
test = st.sidebar.write("Select the processing order of slave images")
with st.sidebar:
imgs_path2 = imgs_path.copy()
imgs_path2.pop(master_index)
sorted_items = sort_items(imgs_path2, multi_containers=False, direction='vertical')
TEMPLATE_SIZE = 64
SEARCH_BUFFER = 32
# if canvas_result.image_data is not None:
# st.image(canvas_result.image_data)
if canvas_result.json_data is not None:
df = pd.json_normalize(canvas_result.json_data["objects"]) # need to convert obj to str because PyArrow
if 'type' in df.keys():
#st.write(df.keys())
df = df[['type', 'left', 'top']]
df[sorted_items] = np.nan
for index, row in df.iterrows():
#print(row['type'], row['top'])
i = int(row['left'])
j = int(row['top'])
template = np.array(imgs[master_index])[j:j+TEMPLATE_SIZE,
i:i+TEMPLATE_SIZE]
# Loop on slave imgs
st.image(template)
for item in sorted_items:
st.write(item)
search_area = np.array(imgs_dict[item])[j-SEARCH_BUFFER:j+TEMPLATE_SIZE+SEARCH_BUFFER,
i-SEARCH_BUFFER:i+TEMPLATE_SIZE+SEARCH_BUFFER]
st.image(search_area)
px, py, max_val = m.template_match(template.astype('uint8'), search_area.astype('uint8'))
st.write(py)
#Covert df to string for printing
for col in df.select_dtypes(include=['object']).columns:
df[col] = df[col].astype("str")
st.dataframe(df)
|