{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport math\nfrom sklearn import mixture\nfrom sklearn.utils import shuffle\nfrom skimage import measure\nfrom glob import glob\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-08T06:46:01.118519Z","iopub.execute_input":"2023-05-08T06:46:01.118876Z","iopub.status.idle":"2023-05-08T06:46:02.946025Z","shell.execute_reply.started":"2023-05-08T06:46:01.118792Z","shell.execute_reply":"2023-05-08T06:46:02.945062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import shutil\n# shutil.rmtree(\"/kaggle/working/test_111_Type_1\")\n","metadata":{"execution":{"iopub.status.busy":"2023-05-08T10:11:34.497499Z","iopub.execute_input":"2023-05-08T10:11:34.498114Z","iopub.status.idle":"2023-05-08T10:11:34.503596Z","shell.execute_reply.started":"2023-05-08T10:11:34.498075Z","shell.execute_reply":"2023-05-08T10:11:34.502601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_DATA = \"/kaggle/input/test111/test/Type_3\"\n# TEST_DATA = \"../input/intel-mobileodt-cervical-cancer-screening/test/test\"\n\ntrain_files = glob(os.path.join(TRAIN_DATA, \"*.jpg\"))\n# test_files = glob(os.path.join(TEST_DATA, \"*.jpg\"))","metadata":{"execution":{"iopub.status.busy":"2023-05-08T06:46:26.120254Z","iopub.execute_input":"2023-05-08T06:46:26.120645Z","iopub.status.idle":"2023-05-08T06:46:26.146046Z","shell.execute_reply.started":"2023-05-08T06:46:26.120613Z","shell.execute_reply":"2023-05-08T06:46:26.145249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_image_data(fname):\n    img = cv2.imread(fname)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    return img\n\n\ndef maxHist(hist):\n    maxArea = (0, 0, 0)\n    height = []\n    position = []\n    for i in range(len(hist)):\n        if (len(height) == 0):\n            if (hist[i] > 0):\n                height.append(hist[i])\n                position.append(i)\n        else:\n            if (hist[i] > height[-1]):\n                height.append(hist[i])\n                position.append(i)\n            elif (hist[i] < height[-1]):\n                while (height[-1] > hist[i]):\n                    maxHeight = height.pop()\n                    area = maxHeight * (i - position[-1])\n                    if (area > maxArea[0]):\n                        maxArea = (area, position[-1], i)\n                    last_position = position.pop()\n                    if (len(height) == 0):\n                        break\n                position.append(last_position)\n                if (len(height) == 0):\n                    height.append(hist[i])\n                elif (height[-1] < hist[i]):\n                    height.append(hist[i])\n                else:\n                    position.pop()\n    while (len(height) > 0):\n        maxHeight = height.pop()\n        last_position = position.pop()\n        area = maxHeight * (len(hist) - last_position)\n        if (area > maxArea[0]):\n            maxArea = (area, len(hist), last_position)\n    return maxArea\n\n\ndef maxRect(img):\n    maxArea = (0, 0, 0)\n    addMat = np.zeros(img.shape)\n    for r in range(img.shape[0]):\n        if r == 0:\n            addMat[r] = img[r]\n            area = maxHist(addMat[r])\n            if area[0] > maxArea[0]:\n                maxArea = area + (r,)\n        else:\n            addMat[r] = img[r] + addMat[r - 1]\n            addMat[r][img[r] == 0] *= 0\n            area = maxHist(addMat[r])\n            if area[0] > maxArea[0]:\n                maxArea = area + (r,)\n    return (\n    int(maxArea[3] + 1 - maxArea[0] / abs(maxArea[1] - maxArea[2])), maxArea[2], maxArea[3], maxArea[1], maxArea[0])\n","metadata":{"execution":{"iopub.status.busy":"2023-05-08T06:46:33.165119Z","iopub.execute_input":"2023-05-08T06:46:33.165479Z","iopub.status.idle":"2023-05-08T06:46:33.182345Z","shell.execute_reply.started":"2023-05-08T06:46:33.165447Z","shell.execute_reply":"2023-05-08T06:46:33.181418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def cropCircle(img):\n    if (img.shape[0] > img.shape[1]):\n        tile_size = (int(img.shape[1] * 256 / img.shape[0]), 256)\n    else:\n        tile_size = (256, int(img.shape[0] * 256 / img.shape[1]))\n\n    img = cv2.resize(img, dsize=tile_size)\n\n    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n    _, thresh = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)\n\n    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n\n    main_contour = sorted(contours, key=cv2.contourArea, reverse=True)[0]\n\n    ff = np.zeros((gray.shape[0], gray.shape[1]), 'uint8')\n    cv2.drawContours(ff, main_contour, -1, 1, 15)\n    ff_mask = np.zeros((gray.shape[0] + 2, gray.shape[1] + 2), 'uint8')\n    cv2.floodFill(ff, ff_mask, (int(gray.shape[1] / 2), int(gray.shape[0] / 2)), 1)\n    # cv2.circle(ff, (int(gray.shape[1]/2), int(gray.shape[0]/2)), 3, 3, -1)\n\n    rect = maxRect(ff)\n    img_crop = img[min(rect[0], rect[2]):max(rect[0], rect[2]), min(rect[1], rect[3]):max(rect[1], rect[3])]\n    cv2.rectangle(ff, (min(rect[1], rect[3]), min(rect[0], rect[2])), (max(rect[1], rect[3]), max(rect[0], rect[2])), 3,\n                  2)\n\n    return img_crop\n\ndef Ra_space(img, Ra_ratio, a_threshold):\n    imgLab = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)\n    w = img.shape[0]\n    h = img.shape[1]\n    Ra = np.zeros((w * h, 2))\n    for i in range(w):\n        for j in range(h):\n            R = math.sqrt((w / 2 - i) * (w / 2 - i) + (h / 2 - j) * (h / 2 - j))\n            Ra[i * h + j, 0] = R\n            Ra[i * h + j, 1] = min(imgLab[i][j][1], a_threshold)\n\n    Ra[:, 0] /= max(Ra[:, 0])\n    Ra[:, 0] *= Ra_ratio\n    Ra[:, 1] /= max(Ra[:, 1])\n\n    return Ra","metadata":{"execution":{"iopub.status.busy":"2023-05-08T06:46:38.460567Z","iopub.execute_input":"2023-05-08T06:46:38.460943Z","iopub.status.idle":"2023-05-08T06:46:38.475754Z","shell.execute_reply.started":"2023-05-08T06:46:38.460909Z","shell.execute_reply":"2023-05-08T06:46:38.474618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def img_is_color(img):\n\n    if len(img.shape) == 3:\n        # Check the color channels to see if they're all the same.\n        c1, c2, c3 = img[:, : , 0], img[:, :, 1], img[:, :, 2]\n        if (c1 == c2).all() and (c2 == c3).all():\n            return True\n\n    return False\n\ndef show_image_list(list_images, list_titles=None, list_cmaps=None, grid=True, num_cols=2, figsize=(20, 10), title_fontsize=30):\n    '''\n    Shows a grid of images, where each image is a Numpy arrayshow_image_list The images can be either\n    RGB or grayscale.\n\n    Parameters:\n    ----------\n    images: list\n        List of the images to be displayed.\n    list_titles: list or None\n        Optional list of titles to be shown for each image.\n    list_cmaps: list or None\n        Optional list of cmap values for each image. If None, then cmap will be\n        automatically inferred.\n    grid: boolean\n        If True, show a grid over each image\n    num_cols: int\n        Number of columns to show.\n    figsize: tuple of width, height\n        Value to be passed to pyplot.figure()\n    title_fontsize: int\n        Value to be passed to set_title().\n    '''\n\n    assert isinstance(list_images, list)\n    assert len(list_images) > 0\n    assert isinstance(list_images[0], np.ndarray)\n\n    if list_titles is not None:\n        assert isinstance(list_titles, list)\n        assert len(list_images) == len(list_titles), '%d imgs != %d titles' % (len(list_images), len(list_titles))\n\n    if list_cmaps is not None:\n        assert isinstance(list_cmaps, list)\n        assert len(list_images) == len(list_cmaps), '%d imgs != %d cmaps' % (len(list_images), len(list_cmaps))\n\n    num_images  = len(list_images)\n    num_cols    = min(num_images, num_cols)\n    num_rows    = int(num_images / num_cols) + (1 if num_images % num_cols != 0 else 0)\n\n    # Create a grid of subplots.\n    fig, axes = plt.subplots(num_rows, num_cols, figsize=figsize)\n    \n    # Create list of axes for easy iteration.\n    if isinstance(axes, np.ndarray):\n        list_axes = list(axes.flat)\n    else:\n        list_axes = [axes]\n\n    for i in range(num_images):\n\n        img    = list_images[i]\n        title  = list_titles[i] if list_titles is not None else 'Image %d' % (i)\n        cmap   = list_cmaps[i] if list_cmaps is not None else (None if img_is_color(img) else 'gray')\n        \n        list_axes[i].imshow(img, cmap=cmap)\n        list_axes[i].set_title(title, fontsize=title_fontsize) \n        list_axes[i].grid(grid)\n\n    for i in range(num_images, len(list_axes)):\n        list_axes[i].set_visible(False)\n\n    fig.tight_layout()\n    _ = plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-08T06:46:44.204544Z","iopub.execute_input":"2023-05-08T06:46:44.204913Z","iopub.status.idle":"2023-05-08T06:46:44.217691Z","shell.execute_reply.started":"2023-05-08T06:46:44.204883Z","shell.execute_reply":"2023-05-08T06:46:44.216727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nos.mkdir('/kaggle/working/test_111_Type_3')\n\n","metadata":{"execution":{"iopub.status.busy":"2023-05-08T09:44:13.708773Z","iopub.execute_input":"2023-05-08T09:44:13.709206Z","iopub.status.idle":"2023-05-08T09:44:13.713758Z","shell.execute_reply.started":"2023-05-08T09:44:13.709155Z","shell.execute_reply":"2023-05-08T09:44:13.712840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install install Pillow","metadata":{"execution":{"iopub.status.busy":"2023-05-08T07:08:31.155226Z","iopub.execute_input":"2023-05-08T07:08:31.155600Z","iopub.status.idle":"2023-05-08T07:08:40.375105Z","shell.execute_reply.started":"2023-05-08T07:08:31.155569Z","shell.execute_reply":"2023-05-08T07:08:40.373882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nn=1\nfor f in sorted(train_files):\n    if TRAIN_DATA in f:\n        img_type = 'train'\n        clss = int(os.path.basename(os.path.dirname(f)).split('_')[1]) - 1\n        print(f,clss)\n#     if TEST_DATA in f:\n#         img_type = 'test'\n#         clss = int(os.path.basename(os.path.dirname(f)).split('_')[1]) - 1\n#         print(f,clss)\n    try:\n        img = get_image_data(f)\n    except:\n        print('Image read error: {}. Skip it!'.format(f))\n        continue\n    if img is None:\n        print('Problem with image: {}. Skip it!'.format(f))\n        continue\n    initial_shape = img.shape[:2]\n\n    img = cropCircle(img)\n    w = img.shape[0]\n    h = img.shape[1]\n\n    imgLab = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)\n    Ra = Ra_space(img, 1.0, 150)\n    a_channel = np.reshape(Ra[:, 1], (w, h))\n    g = mixture.GaussianMixture(n_components=2, covariance_type='diag', random_state=0, init_params='kmeans')\n    image_array_sample = shuffle(Ra, random_state=0)[:1000]\n    g.fit(image_array_sample)\n    labels = g.predict(Ra)\n    labels += 1  \n    labels_2D = np.reshape(labels, (w, h))\n    gg_labels_regions = measure.regionprops(labels_2D, intensity_image=a_channel)\n    gg_intensity = [prop.mean_intensity for prop in gg_labels_regions]\n    cervix_cluster = gg_intensity.index(max(gg_intensity)) + 1\n    mask = np.zeros((w * h, 1), 'uint8')\n    mask[labels == cervix_cluster] = 255\n    mask_2D = np.reshape(mask, (w, h))\n    cc_labels = measure.label(mask_2D, background=0)\n    regions = measure.regionprops(cc_labels)\n    areas = [prop.area for prop in regions]\n    regions_label = [prop.label for prop in regions]\n    largestCC_label = regions_label[areas.index(max(areas))]\n    mask_largestCC = np.zeros((w, h), 'uint8')\n    mask_largestCC[cc_labels == largestCC_label] = 255\n    img_masked = img.copy()\n    img_masked[mask_largestCC == 0] = (0, 0, 0)\n    img_masked_gray = cv2.cvtColor(img_masked, cv2.COLOR_RGB2GRAY)\n    _, thresh_mask = cv2.threshold(img_masked_gray, 0, 255, 0)\n    kernel = np.ones((11, 11), np.uint8)\n    thresh_mask = cv2.dilate(thresh_mask, kernel, iterations=1)\n    thresh_mask = cv2.erode(thresh_mask, kernel, iterations=2)\n    contours_mask,_ = cv2.findContours(thresh_mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n\n    try:\n        main_contour = sorted(contours_mask, key=cv2.contourArea, reverse=True)[0]\n    except:\n        print('Contour problem for {}. skip it!'.format(f))\n        continue\n    \n    x, y, w, h = cv2.boundingRect(main_contour)\n    crop_img = img[y:y+h, x:x+w]\n#     crop_img = cv2.resize(crop_img, (256, 256))\n\n    \n#     show_image_list(list_images=[crop_img])\n    \n    im = Image.fromarray(crop_img)\n    \n \n    im.save(f\"/kaggle/working/test_111_Type_3/img_{n}.jpg\")\n    n=n+1\n        \n#     show_image_list(list_images=[img,crop_img], \n#                 list_titles=['original', 'cropped'],\n#                 num_cols=2,\n#                 figsize=(8, 4),\n#                 grid=False,\n#                 title_fontsize=12)\n    print('Image shape is : ',crop_img.shape)\n    \n    \n    \n\n    \n    \n    ","metadata":{"execution":{"iopub.status.busy":"2023-05-08T07:08:57.720865Z","iopub.execute_input":"2023-05-08T07:08:57.721652Z","iopub.status.idle":"2023-05-08T07:09:58.667110Z","shell.execute_reply.started":"2023-05-08T07:08:57.721588Z","shell.execute_reply":"2023-05-08T07:09:58.666272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(im)\n# len(crop_img)","metadata":{"execution":{"iopub.status.busy":"2023-02-05T21:36:40.852543Z","iopub.execute_input":"2023-02-05T21:36:40.853154Z","iopub.status.idle":"2023-02-05T21:36:40.859649Z","shell.execute_reply.started":"2023-02-05T21:36:40.853105Z","shell.execute_reply":"2023-02-05T21:36:40.858811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\npath = \"/kaggle/working/test_111_Type_3\"\ncount = len(os.listdir(path))\n\nprint(f\"There are {count} files in {path}\")\n","metadata":{},"execution_count":null,"outputs":[]}]}