AlowaSawsan's picture
Update app.py
3d3d9ff
#import required libraries-----------------------------------------------
import streamlit as st
from tensorflow import keras
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
from imutils import perspective
from scipy.spatial import distance as dist
#loading model-----------------------------------------------------------
model=keras.models.load_model("3rdm_att_UNet_50epochs_acc.h5")
#User Interface----------------------------------------------------------
st.header("Lower Left Third Molar Detection and Measurements in Panoramic X-ray Images")
examples=["4.png","20.png","31.png"]
def load_image(image_file):
img = Image.open(image_file)
return img
st.subheader("Instruction:")
st.subheader("Please select an image from the provided samples or upload dental panoramic X-ray image")
image_file = st.file_uploader("Upload Images", type=["png","jpg","jpeg"])
col1, col2, col3 = st.columns(3)
with col1:
ex=load_image(examples[0])
st.image(ex,width=200)
if st.button('Sample 1'):
image_file=examples[0]
with col2:
ex1=load_image(examples[1])
st.image(ex1,width=200)
if st.button('Sample 2'):
image_file=examples[1]
with col3:
ex2=load_image(examples[2])
st.image(ex2,width=200)
if st.button('Sample 3'):
image_file=examples[2]
#main--------------------------------------------------------------------
def midpoint(ptA, ptB):
return ((ptA[0] + ptB[0]) /2 , (ptA[1] + ptB[1]) /2)
def draw_dimensions(orig_image,predict_image,erode_iteration,open_iteration):
kernel1 =( np.ones((5,5), dtype=np.float32))#
kernel_sharpening = np.array([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])#
image = predict_image
image2 = orig_image
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel1,iterations=open_iteration )
image = cv2.filter2D(image, -1, kernel_sharpening)
image = cv2.erode(image,kernel1,iterations =erode_iteration)
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#original
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
labels=cv2.connectedComponents(thresh,connectivity=8)[1]
a=np.unique(labels)
count2=0
for label in a:
if label == 0:
continue
# Create a mask
mask = np.zeros(thresh.shape, dtype="uint8")
mask[labels == label] = 255
# Find contours and determine contour area
cnts,hieararch = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0]
c_area = cv2.contourArea(cnts)
(x,y),radius = cv2.minEnclosingCircle(cnts)
rect = cv2.minAreaRect(cnts)
box = cv2.boxPoints(rect)
box = np.array(box, dtype="int")
box = perspective.order_points(box)
color1 = (list(np.random.choice(range(150), size=3)))
color =[int(color1[0]), int(color1[1]), int(color1[2])]
cv2.drawContours(image2,[box.astype("int")],0,color,2)
(tl,tr,br,bl)=box
(tltrX,tltrY)=midpoint(tl,tr)
(blbrX,blbrY)=midpoint(bl,br)
# compute the midpoint between the top-left and top-right points,
# followed by the midpoint between the top-righ and bottom-right
(tlblX,tlblY)=midpoint(tl,bl)
(trbrX,trbrY)=midpoint(tr,br)
# draw the midpoints on the image
cv2.circle(image2, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)
cv2.circle(image2, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)
cv2.circle(image2, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)
cv2.circle(image2, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)
cv2.line(image2, (int(tltrX), int(tltrY)), (int(blbrX), int(blbrY)),color, 2)
cv2.line(image2, (int(tlblX), int(tlblY)), (int(trbrX), int(trbrY)),color, 2)
dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))
dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))
global dimA
dimA = dA*0.08
global dimB
dimB = dB*0.08
cv2.putText(image2, "{:.1f} millimeter".format(dimA),(int(tltrX - 10), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,0.65, (0,0,0), 2)
cv2.putText(image2, "{:.1f} millimeter".format(dimB),(int(trbrX + 10), int(trbrY+10)), cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,0), 2)
return image2
if image_file is not None:
img=load_image(image_file)
st.text("Selected Image ....")
st.image(img,width=850)
img = np.asarray(img)
img_prd= cv2.resize(img , (512, 256))
img_prd = cv2.cvtColor(img_prd, cv2.COLOR_BAYER_GR2GRAY)
img_prd = np.expand_dims(img_prd, axis=0)
prediction = model.predict(img_prd)
prediction=prediction*255
prediction = prediction.astype("uint8")
prediction_img=prediction.reshape(256,512)
img2 = np.zeros( ( np.array(prediction_img).shape[0], np.array(prediction_img).shape[1], 3 ) )
img2[:,:,0] = prediction_img
img2[:,:,1] = prediction_img
img2[:,:,2] = prediction_img
img2 = img2.astype("uint8")
predicted = cv2.resize(img2 , (img.shape[1],img.shape[0]), interpolation=cv2.INTER_LANCZOS4)
output=draw_dimensions(img,predicted,3,2)
if output is not None :
st.subheader("Result")
#st.write(output.shape)
st.image(output,width=850)
st.text("DONE!")