File size: 5,822 Bytes
9885633
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faf482f
9885633
d3c9b61
 
 
 
 
 
 
 
 
 
 
 
 
 
9885633
 
 
 
 
 
 
 
 
 
3dfcd80
5627ad0
9885633
 
 
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# Libraries
import streamlit as st
from tensorflow import keras
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
import matplotlib.pyplot as plt
from imutils import perspective
from scipy.spatial import distance as dist
import os

# Constants
MODEL_PATH = 'model.h5'
IMAGE_DIR = 'images'

# Functions 
def load_image(image_file):
    img = Image.open(image_file)
    return img

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 

def segment_molar(image_file):

    img=load_image(image_file)
      
    img = np.asarray(img)     
    img = cv2.resize(img, (512, 256))
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    img = np.expand_dims(img, axis=0)

    prediction = model.predict(img)

    output = prediction.reshape(256,512)

    return img , output

def measure_molar(image_file):

    img=load_image(image_file)
      
    img = np.asarray(img) 
    img_prd= cv2.resize(img , (512, 256))
    img_prd = cv2.cvtColor(img_prd, cv2.COLOR_RGB2GRAY)
    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)

    return output

# Load model and images
model = keras.models.load_model(MODEL_PATH)
images = os.listdir(IMAGE_DIR)
images = [f'{IMAGE_DIR}/{image}' for image in images]

# Labels
labels = {'fatemeh_hafari_27022022_181119right.png': 'classI',
 'majid_mohammadkhanlu_19022022_175338right.png': 'mesioangular',
 'zahra_khodabandeh_17052022_162804right.png': 'mesioangular',
 '133028019739531250right.png': 'classII',
 'khadijeh_fard_aghababaei_03012022_120330right.png': 'B',
 'moharam_ali_khamseh_01112021_194329right.png': 'B',
 'parniya_mohamadinasab_08112021_184639right.png': 'B',
 'afsaneh_khalaji_24022022_183000right.png': 'B',
 'sogand_rahmani_13072022_113636right.png': 'B',
 'fatemeh_mirzaei_13072022_101734right.png': 'mesioangular',
 'fatemeh_hoseini_24012022_111330right.png': 'C',
 'padisar_ebrahimi_13122021_111512right.png': 'mesioangular'}

# UserInterface
st.header("3rdMolar Segmentation")
st.subheader("Select Image:")
image_file = st.selectbox('Select Image' , images)

if image_file is not None:

    img , output1 = segment_molar(image_file)
    output2 = measure_molar(image_file)
    
    st.subheader(f"Label : {labels[image_file.split('/')[1]]}")
    st.image(img[0],width=850)
    st.image(output1,width=850)
    st.image(output2,width=850)