{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Morphological Transformations\nThis kernel shows some image augmentation using morphological transformations.\nhttps://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"from pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"perquet_path = \"/kaggle/input/bengaliai-cv19/train_image_data_0.parquet\"\ndf = pd.read_parquet(perquet_path)\nh = 137\nw = 236","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_augmented_img(img, func):\n    output_img = np.zeros((h * 2, w), dtype=np.uint8)\n    output_img[:h] = img\n    output_img[h:] = func(img)\n    return output_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def show_augmented_img(f):\n    cols, rows = 5, 3\n    img_num = cols * rows\n    fig = plt.figure(figsize=(18,12))\n\n    for i in range(img_num):\n        img = get_augmented_img(data[i], f)\n        ax = fig.add_subplot(rows, cols, i + 1)\n        ax.imshow(img)\n        ax.set_axis_off()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub_df = df.sample(n=15)\ndata = 255 - sub_df.iloc[:, 1:].values.reshape(-1, h, w).astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Erosion"},{"metadata":{"trusted":true},"cell_type":"code","source":"def f(img):\n    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, tuple(np.random.randint(1, 6, 2)))\n    img = cv2.erode(img, kernel, iterations=1)\n    return img\n\nshow_augmented_img(f)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Dilation"},{"metadata":{"trusted":true},"cell_type":"code","source":"def f(img):\n    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, tuple(np.random.randint(1, 6, 2)))\n    img = cv2.dilate(img, kernel, iterations=1)\n    return img\n\nshow_augmented_img(f)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Opening\nOpening is performed by successively applying erosion and dilation. It can be used to remove noise. Here erosion and dilation with random kernel is used as image augmentation."},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_random_kernel():\n    structure = np.random.choice([cv2.MORPH_RECT, cv2.MORPH_ELLIPSE, cv2.MORPH_CROSS])\n    kernel = cv2.getStructuringElement(structure, tuple(np.random.randint(1, 6, 2)))\n    return kernel\n\ndef f(img):\n    img = cv2.erode(img, get_random_kernel(), iterations=1)\n    img = cv2.dilate(img, get_random_kernel(), iterations=1)\n    return img\n\nshow_augmented_img(f)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Closing\nClosing is performed by successively applying dilation and erosion. It can be used to 'close' small holes. Here dilation and erosion with random kernel is used as image augmentation."},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_random_kernel():\n    structure = np.random.choice([cv2.MORPH_RECT, cv2.MORPH_ELLIPSE, cv2.MORPH_CROSS])\n    kernel = cv2.getStructuringElement(structure, tuple(np.random.randint(1, 6, 2)))\n    return kernel\n\ndef f(img):\n    img = cv2.dilate(img, get_random_kernel(), iterations=1)\n    img = cv2.erode(img, get_random_kernel(), iterations=1)\n    return img\n\nshow_augmented_img(f)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":1}