{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":18647,"databundleVersionId":1126921,"sourceType":"competition"}],"dockerImageVersionId":29867,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"The code below selects 16 128x128 tiles for each image and mask based on the maximum number of tissue pixels. The kernel also provides computed image stats. Please check my kernels to see how to use this data. \n![](https://i.ibb.co/RzSWP56/convert.png)","metadata":{}},{"cell_type":"code","source":"import os\nimport cv2\nimport skimage.io\nfrom tqdm.notebook import tqdm\nimport zipfile\nimport numpy as np","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-28T12:18:32.621433Z","iopub.execute_input":"2024-02-28T12:18:32.621831Z","iopub.status.idle":"2024-02-28T12:18:32.627489Z","shell.execute_reply.started":"2024-02-28T12:18:32.621794Z","shell.execute_reply":"2024-02-28T12:18:32.626265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN = '../input/prostate-cancer-grade-assessment/train_images/'\nMASKS = '../input/prostate-cancer-grade-assessment/train_label_masks/'\n\nOUT_TRAIN = 'train.zip'\nsz = 256\nN = 36","metadata":{"execution":{"iopub.status.busy":"2024-02-28T12:18:35.785653Z","iopub.execute_input":"2024-02-28T12:18:35.786647Z","iopub.status.idle":"2024-02-28T12:18:35.793094Z","shell.execute_reply.started":"2024-02-28T12:18:35.786577Z","shell.execute_reply":"2024-02-28T12:18:35.791591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def tile(img):\n    result = []\n    shape = img.shape\n    pad0,pad1 = (sz - shape[0]%sz)%sz, (sz - shape[1]%sz)%sz\n    img = np.pad(img,[[pad0//2,pad0-pad0//2],[pad1//2,pad1-pad1//2],[0,0]],\n                constant_values=255)\n    img = img.reshape(img.shape[0]//sz,sz,img.shape[1]//sz,sz,3)\n    img = img.transpose(0,2,1,3,4).reshape(-1,sz,sz,3)\n\n    if len(img) < N:\n        img = np.pad(img,[[0,N-len(img)],[0,0],[0,0],[0,0]],constant_values=255)\n    idxs = np.argsort(img.reshape(img.shape[0],-1).sum(-1))[:N]\n    img = img[idxs]\n    for i in range(len(img)):\n        result.append({'img':img[i], 'idx':i})\n    return result","metadata":{"execution":{"iopub.status.busy":"2024-02-28T12:18:39.664538Z","iopub.execute_input":"2024-02-28T12:18:39.665029Z","iopub.status.idle":"2024-02-28T12:18:39.678817Z","shell.execute_reply.started":"2024-02-28T12:18:39.664993Z","shell.execute_reply":"2024-02-28T12:18:39.677981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_tot,x2_tot = [],[]\nnames = [name[:-10] for name in os.listdir(MASKS)]\nwith zipfile.ZipFile(OUT_TRAIN, 'w') as img_out:\n    for name in tqdm(names):\n        img = skimage.io.MultiImage(os.path.join(TRAIN,name+'.tiff'))[-1]\n        tiles = tile(img)\n        for t in tiles:\n            img,idx = t['img'],t['idx']\n            x_tot.append((img/255.0).reshape(-1,3).mean(0))\n            x2_tot.append(((img/255.0)**2).reshape(-1,3).mean(0)) \n            #if read with PIL RGB turns into BGR\n            img = cv2.imencode('.png',cv2.cvtColor(img, cv2.COLOR_RGB2BGR))[1]\n            img_out.writestr(f'{name}_{idx}.png', img)\n","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2024-02-28T12:18:44.071408Z","iopub.execute_input":"2024-02-28T12:18:44.071902Z","iopub.status.idle":"2024-02-28T12:59:57.916941Z","shell.execute_reply.started":"2024-02-28T12:18:44.071867Z","shell.execute_reply":"2024-02-28T12:59:57.914488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#image stats\nimg_avr =  np.array(x_tot).mean(0)\nimg_std =  np.sqrt(np.array(x2_tot).mean(0) - img_avr**2)\nprint('mean:',img_avr, ', std:', np.sqrt(img_std))","metadata":{"execution":{"iopub.status.busy":"2024-02-28T13:05:46.700799Z","iopub.execute_input":"2024-02-28T13:05:46.70223Z","iopub.status.idle":"2024-02-28T13:05:47.268602Z","shell.execute_reply.started":"2024-02-28T13:05:46.702168Z","shell.execute_reply":"2024-02-28T13:05:47.26722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nshutil.make_archive(\"/kaggle/working/output\", 'zip', \"/kaggle/working/\")\n","metadata":{"execution":{"iopub.status.busy":"2024-02-28T13:05:53.105634Z","iopub.execute_input":"2024-02-28T13:05:53.106212Z","iopub.status.idle":"2024-02-28T13:09:45.374603Z","shell.execute_reply.started":"2024-02-28T13:05:53.106157Z","shell.execute_reply":"2024-02-28T13:09:45.373606Z"},"trusted":true},"execution_count":null,"outputs":[]}]}