[1fbc70]: / .ipynb_checkpoints / Lung Cancer Prediction System-checkpoint.ipynb

Download this file

569 lines (568 with data), 22.9 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "788d3638",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import math\n",
    "\n",
    "import glob\n",
    "from tkinter import *\n",
    "from tkinter import filedialog\n",
    "from PIL import ImageTk, Image\n",
    "import os\n",
    "import imghdr\n",
    "import cv2 as cv\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from numpy import sqrt\n",
    "\n",
    "from skimage.transform import pyramid_reduce, resize\n",
    "\n",
    "import skimage.filters as filters\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from sklearn.utils import shuffle\n",
    "                        \n",
    "#models\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.svm import SVC\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras import datasets, layers, models\n",
    "\n",
    "from keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Input, Flatten, Activation\n",
    "\n",
    "#preprocessing part\n",
    "from skimage.segmentation import clear_border\n",
    "from skimage.measure import label,regionprops, perimeter\n",
    "from skimage.morphology import ball, disk, binary_erosion, remove_small_objects, reconstruction, binary_closing, binary_opening\n",
    "from skimage.filters import roberts, sobel\n",
    "from scipy import ndimage as ndi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "83fce547",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total:  1385\n"
     ]
    }
   ],
   "source": [
    "#get all classes names\n",
    "classes_old = [\"Bengin\",\"Malignant\",\"Normal\"]\n",
    "classes = [\"Benign\",\"Malignant\",\"Normal\"]\n",
    "\n",
    "#get all images location(total 1097 img)\n",
    "img_list = sorted(glob.glob('dataset/after_preprocessing/train_test/*/*/*.*'))\n",
    "print('Total: ', len(img_list))\n",
    "\n",
    "#Define variable to hold X & y\n",
    "#create numpy array placeholder for pixels with 1 channel(grayscale)\n",
    "IMG_SIZE = 528\n",
    "CHANNEL = 1\n",
    "#arg: (length of numpy set, height, width, color channel)\n",
    "X_segmented = np.empty((len(img_list), IMG_SIZE, IMG_SIZE), dtype=np.uint8)\n",
    "\n",
    "y = []\n",
    "\n",
    "# convert images to numpy arrays\n",
    "for i, img_path in enumerate(img_list):\n",
    "    # load image\n",
    "    img = cv.imread(img_path, cv.IMREAD_GRAYSCALE)\n",
    "    img = cv.resize(img, (IMG_SIZE, IMG_SIZE))\n",
    "    X_segmented[i] = img\n",
    "    y.append(classes[0]) if img_path.find(classes_old[0]) != -1 else (y.append(classes[1]) if img_path.find(classes_old[1]) != -1 else y.append(classes_old[2]))\n",
    "    \n",
    "y = pd.Series(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7957ef48",
   "metadata": {},
   "outputs": [],
   "source": [
    "IMG_SIZE = 128\n",
    "CHANNEL = 1\n",
    "\n",
    "X_dl_segmented_resize = np.empty((len(img_list), IMG_SIZE, IMG_SIZE), dtype=np.uint8)\n",
    "# X_dl_nodules_resize = np.empty((len(img_list), IMG_SIZE, IMG_SIZE), dtype=np.uint8)\n",
    "# X_dl_nodules_further_resize = np.empty((len(img_list), IMG_SIZE, IMG_SIZE), dtype=np.uint8)\n",
    "\n",
    "for i, img in enumerate(X_segmented):\n",
    "    X_dl_segmented_resize[i] = cv.resize(img, (IMG_SIZE, IMG_SIZE))\n",
    "    \n",
    "# for i, img in enumerate(X_nodules):\n",
    "#     X_nodules_resize[i] = cv.resize(img, (IMG_SIZE, IMG_SIZE))\n",
    "    \n",
    "# for i, img in enumerate(X_nodules_further):\n",
    "#     X_nodules_further_resize[i] = cv.resize(img, (IMG_SIZE, IMG_SIZE))\n",
    "\n",
    "# convert to 3d array\n",
    "X_dl_segmented_resize = X_dl_segmented_resize.reshape(-1, IMG_SIZE, IMG_SIZE, CHANNEL)\n",
    "# X_dl_nodules_resize = X_nodules_resize.reshape(-1, IMG_SIZE, IMG_SIZE, CHANNEL)\n",
    "# X_dl_nodules_further_resize = X_nodules_further_resize.reshape(-1, IMG_SIZE, IMG_SIZE, CHANNEL)\n",
    "\n",
    "# convert to 2d array\n",
    "X_ml_segmented_resize = X_dl_segmented_resize.reshape(X_dl_segmented_resize.shape[0], -1)\n",
    "\n",
    "# #randomizedSearchCV Dataset\n",
    "# X_rscv_segmented = X_segmented.reshape(X_segmented.shape[0], -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8a4fe6cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "#split into train and test and factorize the label\n",
    "X_dl_train_segmented = X_dl_segmented_resize[300:1385]\n",
    "X_dl_test_segmented = X_dl_segmented_resize[0:300]\n",
    "\n",
    "X_ml_train_segmented = X_ml_segmented_resize[300:1385]\n",
    "X_ml_test_segmented = X_ml_segmented_resize[0:300]\n",
    "\n",
    "# X_train_nodules = X_nodules_resize[300:1385]\n",
    "# X_test_nodules = X_nodules_resize[0:300]\n",
    "# X_train_nodules_further = X_nodules_further_resize[300:1385]\n",
    "# X_test_nodules_further = X_nodules_further_resize[0:300]\n",
    "\n",
    "y_train = y[300:1385]\n",
    "y_test = y[0:300]\n",
    "r_rscv = y.copy()\n",
    "\n",
    "y_train = pd.Series(y_train)\n",
    "y_test = pd.Series(y_test)\n",
    "y_rscv = pd.Series(r_rscv)\n",
    "\n",
    "y_train = y_train.factorize()\n",
    "y_test = y_test.factorize()\n",
    "y_rscv = r_rscv.factorize()\n",
    "\n",
    "xtr_dl, xts_dl, ytr_dl, yts_dl = train_test_split(X_dl_segmented_resize, y_rscv[0], test_size=math.floor(len(X_dl_segmented_resize)*0.2167), \n",
    "                                               random_state = np.random.randint(1,1000, 1)[0])\n",
    "xtr_ml, xts_ml, ytr_ml, yts_ml = train_test_split(X_ml_segmented_resize, y_rscv[0], test_size=math.floor(len(X_ml_segmented_resize)*0.2167), \n",
    "                                               random_state = np.random.randint(1,1000, 1)[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fd9e020b",
   "metadata": {},
   "outputs": [],
   "source": [
    "cnn_svm = models.Sequential([\n",
    "        layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, CHANNEL)),\n",
    "        layers.MaxPooling2D((2, 2)),\n",
    "    \n",
    "        layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),\n",
    "        layers.MaxPooling2D((2, 2)),\n",
    "    \n",
    "        layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu'),\n",
    "        layers.MaxPooling2D((2, 2)),\n",
    "    \n",
    "        layers.Conv2D(filters=256, kernel_size=(3, 3), activation='relu'),\n",
    "        layers.MaxPooling2D((2, 2)),\n",
    "    \n",
    "        #dense network\n",
    "        #CNN middle layer no need to specify the shape because the network can figure it out automatically\n",
    "        layers.Flatten(),\n",
    "    ])\n",
    "\n",
    "X_full_cnn_svm = cnn_svm.predict(X_dl_segmented_resize)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1113289b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1385, 9216)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_full_cnn_svm.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6ed00b00",
   "metadata": {},
   "outputs": [],
   "source": [
    "xtr_hybird, xts_hybird, ytr_hybird, yts_hybird = train_test_split(X_full_cnn_svm, y_rscv[0], test_size=math.floor(len(X_dl_segmented_resize)*0.2167), \n",
    "                                               random_state = np.random.randint(1,1000, 1)[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f0b854f2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Random Forest Accuracy:  0.92\n"
     ]
    }
   ],
   "source": [
    "loaded_model = RandomForestClassifier(n_estimators = 200, min_samples_split = 2, min_samples_leaf = 2,\n",
    "                            max_features = 'sqrt', max_depth = 80, bootstrap = False)\n",
    "\n",
    "loaded_model.fit(xtr_hybird, ytr_hybird)\n",
    "\n",
    "y_pred_cnn_rf_bestParam = loaded_model.predict(xts_hybird)\n",
    "cnn_rf_bestParam_segmented_score = accuracy_score(yts_hybird, y_pred_cnn_rf_bestParam)\n",
    "print('Random Forest Accuracy: ', cnn_rf_bestParam_segmented_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e2f618e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_segmented_lungs(im, num, save=False, plot=False, show_on_window=False, crop_percentage=0.05):\n",
    "    #This funtion segments the lungs from the given 2D slice.\n",
    "    \n",
    "    crop = im.copy()\n",
    "    if show_on_window:\n",
    "        height,width=im.shape[:2]\n",
    "        start_row,start_col=int(height*crop_percentage),int(width*crop_percentage)\n",
    "        end_row,end_col=int(height*(1-crop_percentage)),int(width*(1-crop_percentage))\n",
    "        crop=crop[start_row:end_row,start_col:end_col]\n",
    "    else:\n",
    "        if num == 161 or (num >= 173 and num <= 174) or (num == 758):\n",
    "            height,width=im.shape[:2]\n",
    "            start_row,start_col=int(height*0.20),int(width*0.20)\n",
    "            end_row,end_col=int(height*0.80),int(width*0.80)\n",
    "            crop=crop[start_row:end_row,start_col:end_col]\n",
    "        elif num >= 756 and num <= 767:\n",
    "            #Step 1: Crop the image \n",
    "            height,width=im.shape[:2]\n",
    "            start_row,start_col=int(height*0),int(width*0)\n",
    "            end_row,end_col=int(height*1),int(width*1)\n",
    "            crop=crop[start_row:end_row,start_col:end_col]\n",
    "        elif num == 1320 or num == 1219 or (num >= 712 and num <= 767) or (num >= 779 and num <= 799) or (num >= 688 and num <= 699) or (num >= 648 and num <= 664) or (num >= 225 and num <= 234):\n",
    "            #Step 1: Crop the image \n",
    "            height,width=im.shape[:2]\n",
    "            start_row,start_col=int(height*0.03),int(width*0.03)\n",
    "            end_row,end_col=int(height*0.97),int(width*0.97)\n",
    "            crop=crop[start_row:end_row,start_col:end_col]\n",
    "        else:\n",
    "            #Step 1: Crop the image \n",
    "            height,width=im.shape[:2]\n",
    "            start_row,start_col=int(height*0.12),int(width*0.12)\n",
    "            end_row,end_col=int(height*0.88),int(width*0.88)\n",
    "            crop=crop[start_row:end_row,start_col:end_col]\n",
    "        \n",
    "    #Step 2: Convert into a binary image. \n",
    "    ret,binary = cv.threshold(crop,140,255,cv.THRESH_BINARY_INV)\n",
    "    \n",
    "    #Step 3: Remove the blobs connected to the border of the image.\n",
    "    cleared = clear_border(binary) \n",
    "    \n",
    "    #Step 4: Closure operation with a disk of radius 10. This operation is \n",
    "    #to keep nodules attached to the lung wall.\n",
    "    selem = disk(2)\n",
    "    closing = binary_closing(cleared, selem)\n",
    "        \n",
    "    #Step 5: Label the image.\n",
    "    label_image = label(closing)\n",
    "    \n",
    "    #Step 6: Keep the labels with 2 largest areas.\n",
    "    areas = [r.area for r in regionprops(label_image)]\n",
    "    areas.sort()\n",
    "    if len(areas) > 2:\n",
    "        for region in regionprops(label_image):\n",
    "            if region.area < areas[-2]:\n",
    "                for coordinates in region.coords:                \n",
    "                       label_image[coordinates[0], coordinates[1]] = 0\n",
    "    segmented_area = label_image > 0\n",
    "        \n",
    "    #Step 7: Erosion operation with a disk of radius 2. This operation is \n",
    "    #seperate the lung nodules attached to the blood vessels.\n",
    "    selem = disk(2)\n",
    "    erosion = binary_erosion(segmented_area, selem) \n",
    "        \n",
    "    #     Step 4: Closure operation with a disk of radius 10. This operation is \n",
    "    #     to keep nodules attached to the lung wall.\n",
    "    selem = disk(10)\n",
    "    closing2 = binary_closing(erosion, selem)    \n",
    "    \n",
    "    #Step 8: Fill in the small holes inside the binary mask of lungs.\n",
    "    edges = roberts(closing2)\n",
    "    fill_holes = ndi.binary_fill_holes(edges)\n",
    "        \n",
    "    superimpose = crop.copy()\n",
    "    #Step 9: Superimpose叠加 the binary mask on the input image.\n",
    "    get_high_vals = fill_holes == 0\n",
    "    superimpose[get_high_vals] = 0\n",
    "\n",
    "    superimpose = cv.resize(superimpose, (528, 528))    \n",
    "    \n",
    "    if show_on_window:\n",
    "        directory1 = 'result/'\n",
    "        directory2 = '.jpg'\n",
    "        images = [im, crop, binary, cleared, closing, segmented_area, erosion, closing2, fill_holes, superimpose]\n",
    "        titles = ['0_original_image', '1_cropped_image', '2_binary_image', '3_remove_blobs', '4_closure', '5_roi', '6_erosion', '7_closure', '8_fill_hole', '9_result']\n",
    "        for i, title in enumerate(titles):\n",
    "            filename = directory1 + title + directory2\n",
    "            try:\n",
    "                cv.imwrite(filename, images[i])\n",
    "            except:\n",
    "                indices = images[i].astype(np.uint8)  #convert to an unsigned byte\n",
    "                indices*=255\n",
    "                cv.imwrite(filename, indices)\n",
    "    else:\n",
    "        #flip vertically\n",
    "        directory1 = 'preprocessing/pre1/'\n",
    "        directory2 = '.jpg'\n",
    "        images = [crop, binary, cleared, label_image, superimpose]\n",
    "        titles = ['cropped_image', 'binary_image', 'remove_blobs', 'label', 'result']\n",
    "\n",
    "        if save:\n",
    "            for y in range(5):\n",
    "                filename = directory1 + str(y+1) + titles[y] + '/' + titles[y] + str(num+1) + directory2\n",
    "                cv.imwrite(filename, images[y])\n",
    "\n",
    "    images = [im, crop, binary, cleared, closing, label_image, segmented_area, erosion, closing2, fill_holes, superimpose]\n",
    "    \n",
    "    if plot:\n",
    "        titles = ['Original Image', \n",
    "                 'Step 1: Cropped Image', \n",
    "                 'Step 2: Binary image', \n",
    "                 'Step 3: Remove blobs', \n",
    "                 'Step 4: Closure', \n",
    "                 'Step 5: Label', \n",
    "                 'Step 6: Region On Interest',\n",
    "                 'Step 7: Erosion',\n",
    "                 'Step 8: Closure', \n",
    "                 'Step 9: Fill Holes',\n",
    "                 'Step 10: Result']\n",
    "        plot_img(images, titles, camp=plt.cm.bone, rows = 3, cols = 4, fontsize= 50)\n",
    "    \n",
    "#     if show_on_window:\n",
    "#         directory1 = 'result/'\n",
    "#         directory2 = '.jpg'\n",
    "#         titles = ['0_original_image', '1_cropped_image', '2_binary_image', '3_remove_blobs', '4_closure', '5_roi', '6_erosion', '7_fill_hole', '8_result']\n",
    "#         for i, title in enumerate(titles):\n",
    "#             filename = directory1 + title + directory2\n",
    "#             try:\n",
    "#                 cv.imwrite(filename, images[i])\n",
    "#             except:\n",
    "#                 indices = images[i].astype(np.uint8)  #convert to an unsigned byte\n",
    "#                 indices*=255\n",
    "#                 cv.imwrite(filename, indices)\n",
    "    \n",
    "    return superimpose"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d52cdbbf",
   "metadata": {},
   "outputs": [],
   "source": [
    "#define a function to convert the y_pred, y_test to human readable (from 0,1,2... to inclusion, pitted....)\n",
    "def convertLabels(y_test, classes):\n",
    "    return classes[y_test]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "07894d70",
   "metadata": {},
   "outputs": [],
   "source": [
    "root = Tk()\n",
    "root.title('Lung Cancer Prediction System')\n",
    "width= root.winfo_screenwidth()               \n",
    "height= root.winfo_screenheight()               \n",
    "root.geometry(\"%dx%d\" %(width, height))\n",
    "\n",
    "def openfn():\n",
    "    global image_path\n",
    "    filename = filedialog.askopenfilename(initialdir=\"test\", title =\"Select a CT-Scan Image\", filetypes=((\"jpg files\",\"*.jpg*\"),(\"png files\",\"*.png\"),(\"jpeg files\",\"*.jpeg\")))\n",
    "    image_path = filename\n",
    "#     return filename\n",
    "\n",
    "def open_img():\n",
    "#     img_path = openfn()\n",
    "    global image_path\n",
    "    openfn()\n",
    "    if imghdr.what(image_path) == 'png' or imghdr.what(image_path) == 'jpeg' or imghdr.what(image_path) == 'jpg':\n",
    "        img = cv.imread(image_path, cv.IMREAD_GRAYSCALE)\n",
    "        img = cv.resize(img, (528, 528))\n",
    "        \n",
    "        numOfImg = 1\n",
    "        test = img.copy()\n",
    "        segment_result = get_segmented_lungs(test, numOfImg, show_on_window=True, crop_percentage=float(int(clicked.get())/100))\n",
    "        \n",
    "        plot_on_app()\n",
    "        get_prediction_result()\n",
    "        \n",
    "def plot_on_app():\n",
    "    result_list = sorted(glob.glob('result/*.*'))\n",
    "    coor_x = 82\n",
    "    coor_y = 62\n",
    "    for i, result_path in enumerate(result_list):\n",
    "        if i == 5:\n",
    "            coor_y = coor_y + 320\n",
    "            coor_x = 82\n",
    "        img = Image.open(result_path)\n",
    "        img = img.resize((242, 242))\n",
    "        image = ImageTk.PhotoImage(img)\n",
    "\n",
    "        label_image = Label(image=image)\n",
    "        label_image.image = image\n",
    "        label_image.place(x=coor_x,y=coor_y)\n",
    "\n",
    "        coor_x = coor_x + 280\n",
    "\n",
    "def get_prediction_result():\n",
    "    img = cv.imread('result/9_result.jpg', cv.IMREAD_GRAYSCALE)\n",
    "    img = cv.resize(img, (128, 128))\n",
    "    predict_img = np.expand_dims(img, 0)\n",
    "    predict_img = predict_img.reshape(-1, 128, 128, 1)\n",
    "    extraction_predict_img = cnn_svm.predict(predict_img)\n",
    "    result_predict_img = loaded_model.predict(extraction_predict_img)\n",
    "    result_predict_img_converted = convertLabels(result_predict_img[0], classes)\n",
    "    result_label.config(text='Prediction Result : ' + str(result_predict_img_converted))\n",
    "    \n",
    "# Change the label text\n",
    "def recrop():\n",
    "    global image_path\n",
    "    if image_path != '':\n",
    "        img = cv.imread(image_path, cv.IMREAD_GRAYSCALE)\n",
    "        img = cv.resize(img, (528, 528))\n",
    "        numOfImg = 1\n",
    "        test = img.copy()\n",
    "        get_segmented_lungs(test, numOfImg, show_on_window=True, crop_percentage=float(int(clicked.get())/100))\n",
    "        plot_on_app()\n",
    "        get_prediction_result()\n",
    "    \n",
    "coor_x = 80\n",
    "coor_y = 60\n",
    "for i in range(10):\n",
    "    if i == 5:\n",
    "        coor_y = coor_y + 320\n",
    "        coor_x = 80\n",
    "    Frame(root, highlightbackground=\"black\", highlightthickness=2,width=250, height=250).place(x=coor_x, y=coor_y)\n",
    "    coor_x = coor_x + 280\n",
    "    \n",
    "txt1 = 'Select a CT-Scan to predict ->'\n",
    "Label(root, text=txt1, font=('Times', '18', 'italic')).place(x = 40, y = 10)\n",
    "\n",
    "Button(root, text='Select a CT-Scan Image', font=('Times', '13', 'italic'), command=open_img, bg='#C7C6C1', bd=3).place(x = 350, y = 10) \n",
    "titles = ['Original Image', 'Step 1: Cropped Image', 'Step 2: Binary image', 'Step 3: Remove blobs', 'Step 4: Closure'\n",
    "          , 'Step 5: Region On Interest', 'Step 6: Erosion', 'Step 7: Closure', 'Step 8: Fill Holes', 'Step 9: Segmented Result']\n",
    "\n",
    "txt1 = 'Prediction Result : ' \n",
    "result_label = Label(root, text=txt1, font=('Times', '18', 'italic'))\n",
    "result_label.place(x = 40, y = 710)\n",
    "\n",
    "txt1 = 'Average Test Accuracy : 0.9386, Standard Deviation : 0.0246' \n",
    "Label(root, text=txt1, font=('Times', '18', 'italic')).place(x = 770, y = 690)\n",
    "\n",
    "txt1 = 'Average Precision Score : 0.95, Average Recall Score : 0.94, Average F1 Score : 0.94'\n",
    "Label(root, text=txt1, font=('Times', '18', 'italic')).place(x = 650, y = 730)\n",
    "\n",
    "txt1 =  'Crop :            %'\n",
    "Label(root, text=txt1, font=('Times', '18', 'italic')).place(x = 700, y = 10)\n",
    "\n",
    "#txt1 = ''\n",
    "#Label(root, text=text1, font=('Times', '18', 'italic')).place(x = 200, y = 700)\n",
    "\n",
    "# Dropdown menu options\n",
    "options = [\n",
    "    \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\",\n",
    "    \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\",\n",
    "    \"21\", \"22\", \"23\", \"24\", \"25\", \"26\", \"27\", \"28\", \"29\", \"30\"\n",
    "]\n",
    "  \n",
    "# datatype of menu text\n",
    "clicked = StringVar()\n",
    "  \n",
    "# initial menu text\n",
    "clicked.set( \"5\" )\n",
    "  \n",
    "# Create Dropdown menu\n",
    "drop = OptionMenu( root , clicked , *options).place(x = 772, y = 10)\n",
    "\n",
    "Button(root, text='Reload', command=recrop, font=('Times', '13', 'italic'), bg='#C7C6C1', bd=3).place(x = 890, y = 10)\n",
    "\n",
    "coor_x = [130, 370, 660, 940, 1250, 70, 405, 690, 960, 1200]\n",
    "coor_y = 310\n",
    "for i in range(10):\n",
    "    if i == 5:\n",
    "        coor_y = coor_y + 320\n",
    "    Label(root, text=titles[i], font=('Times', '18', 'italic')).place(x = coor_x[i], y = coor_y)\n",
    "\n",
    "#variable declare\n",
    "image_path = ''\n",
    "    \n",
    "root.mainloop()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}