{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport cv2\nfrom tqdm import tqdm\nfrom PIL import Image\nimport os\nimport gc\nimport skimage.io","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"MAXIMUM_SIZE = 1024\n\ndef crop_white(image):\n    if np.unique(image).shape[0] != 1:\n        #CROPPING WHITE SPACE\n        white = np.array([255, 255, 255])\n        mask = np.abs(image - white).sum(axis=2) < 5\n\n        # Find the bounding box of those pixels\n        coords = np.array(np.nonzero(~mask))\n        top_left = np.min(coords, axis=1)\n        bottom_right = np.max(coords, axis=1)\n\n        image = image[top_left[0]:bottom_right[0],\n                    top_left[1]:bottom_right[1]]\n\n        gc.collect()\n    return image\n\ndef adjust_size(vv):\n\n    h, w, c = vv.shape\n\n    if h > MAXIMUM_SIZE and w <= MAXIMUM_SIZE:\n        vv = cv2.resize(vv, (w, MAXIMUM_SIZE), interpolation=cv2.INTER_AREA)\n        h, w, c = vv.shape\n\n    elif h <= MAXIMUM_SIZE and w > MAXIMUM_SIZE:\n        vv = cv2.resize(vv, (MAXIMUM_SIZE, h), interpolation=cv2.INTER_AREA)\n        h, w, c = vv.shape\n\n\n    elif h > MAXIMUM_SIZE and w > MAXIMUM_SIZE:\n        vv = cv2.resize(vv, (MAXIMUM_SIZE, MAXIMUM_SIZE), interpolation=cv2.INTER_AREA)\n        h, w, c = vv.shape\n        \n    tb = MAXIMUM_SIZE - h\n    t = tb // 2\n    b = tb - t\n\n    lr = MAXIMUM_SIZE - w\n    l = lr // 2\n    r = lr - l\n    \n    vv = cv2.copyMakeBorder(vv.copy(),t,b,l,r,cv2.BORDER_CONSTANT,value=[255, 255, 255])\n    gc.collect()\n    return vv\n\ndef make_tiles(vv):\n    tile_size = 1024\n    h, w, c = vv.shape\n    img = vv.reshape(h // tile_size, tile_size, w // tile_size, tile_size,3)\n    img = img.transpose(0,2,1,3,4).reshape(-1, tile_size, tile_size,3)\n    return img\n\ndef encode_image(vv, MAX_PER_CHANNEL = 10):\n    DIV_FACTOR = 255 / (MAX_PER_CHANNEL - 1)\n    vv = vv / DIV_FACTOR\n    vv = vv.astype('ulonglong')\n    pows = []\n    k = 0\n    while k < vv.shape[0]:\n        power = MAX_PER_CHANNEL ** k\n        vv[k, ] = vv[k, ] * power\n        k += 1\n    vv = np.sum(vv, axis=0)\n    return vv\n\ndef decode_image(x, MAX_PER_CHANNEL = 10, SMOOTH=True):\n    x = x.astype('ulonglong')\n    DIV_FACTOR = 255 / (MAX_PER_CHANNEL - 1)\n    vv = []\n    k = 0\n    while k < 16:\n        v = x % MAX_PER_CHANNEL\n        vv.append(v)\n        x = x // MAX_PER_CHANNEL\n        \n        k += 1\n    vv = np.stack(vv)\n    vv = vv * DIV_FACTOR\n    if SMOOTH:\n        k = 0\n        while k < vv.shape[0]:\n            vv[k, ] = smooth_decoded(vv[k, ])\n            k += 1\n    return vv\n\ndef smooth_decoded(x):\n    white = np.array([255, 255, 255])\n    mask = np.abs(x - white).sum(axis=2) < 120\n    x[mask] = 255\n    return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN = '../input/prostate-cancer-grade-assessment/train_images/'\nimgs = os.listdir(TRAIN)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x = skimage.io.MultiImage(os.path.join(TRAIN,imgs[6]))[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cropped = crop_white(x)\nx.shape, cropped.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Original Image"},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image\ncropped = Image.fromarray(cropped)\ncrop_size = 4096\nwidth, height = cropped.size   # Get dimensions\nleft = (width - crop_size)/2\ntop = (height - crop_size)/2\nright = (width + crop_size)/2\nbottom = (height + crop_size)/2\n# Crop the center of the image\ncropped = cropped.crop((left, top, right, bottom))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cropped","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Make Tiles"},{"metadata":{"trusted":true},"cell_type":"code","source":"tiles = make_tiles(np.array(cropped))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tiles.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Some Tiles"},{"metadata":{"trusted":true},"cell_type":"code","source":"Image.fromarray(tiles[0].astype('uint8'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Image.fromarray(tiles[8].astype('uint8'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Fold Tiles, Encode and Compress"},{"metadata":{"trusted":true},"cell_type":"code","source":"encoded = encode_image(tiles)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.savez_compressed('train/encoded.npz', encoded)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Decompress, Decode and UnFold Tiles"},{"metadata":{"trusted":true},"cell_type":"code","source":"decoded = decode_image(encoded)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"decoded.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Image.fromarray(decoded[0].astype('uint8'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Image.fromarray(decoded[8].astype('uint8'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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":4}