{"cells":[{"metadata":{},"cell_type":"markdown","source":"# In this kernel, I'm showing how to approximate lung volume with trapezoidal rule and threshold-based per-slice lung area detection (inspired from https://www.kaggle.com/miklgr500/lung-volume-feature)"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\n\nimport numpy as np\nimport pandas as pd\nimport pydicom\n\nfrom skimage.measure import label,regionprops\nfrom skimage.segmentation import clear_border\nfrom tqdm.notebook import tqdm \nfrom multiprocessing import Pool\n\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## What is Trapezoidal Rule ?\n\n### Trapezoidal rule is a technique for approximating the definite integral."},{"metadata":{},"cell_type":"markdown","source":"![ff1e6d438c8e663ed8ab18d19b011371c24b3ac7.svg](attachment:ff1e6d438c8e663ed8ab18d19b011371c24b3ac7.svg)","attachments":{"ff1e6d438c8e663ed8ab18d19b011371c24b3ac7.svg":{"image/svg+xml":"PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjMwLjg1ZXgiIGhlaWdodD0iNi4zNDNleCIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMi4zMzhleDsiIHZpZXdCb3g9IjAgLTE3MjQuMiAxMzI4Mi43IDI3MzAuOCIgcm9sZT0iaW1nIiBmb2N1c2FibGU9ImZhbHNlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGFyaWEtbGFiZWxsZWRieT0iTWF0aEpheC1TVkctMS1UaXRsZSI+Cjx0aXRsZSBpZD0iTWF0aEpheC1TVkctMS1UaXRsZSI+e1xkaXNwbGF5c3R5bGUgXGludCBfe2F9XntifWYoeClcLGR4XGFwcHJveCAoYi1hKVxjZG90IHtcdGZyYWMge2YoYSkrZihiKX17Mn19fTwvdGl0bGU+CjxkZWZzIGFyaWEtaGlkZGVuPSJ0cnVlIj4KPHBhdGggc3Ryb2tlLXdpZHRoPSIxIiBpZD0iRTEtTUpTWjItMjIyQiIgZD0iTTExNCAtNzk4UTEzMiAtODI0IDE2NSAtODI0SDE2N1ExOTUgLTgyNCAyMjMgLTc2NFQyNzUgLTYwMFQzMjAgLTM5MVQzNjIgLTE2NFEzNjUgLTE0MyAzNjcgLTEzM1E0MzkgMjkyIDUyMyA2NTVUNjQ1IDExMjdRNjUxIDExNDUgNjU1IDExNTdUNjcyIDEyMDFUNjk5IDEyNTdUNzMzIDEzMDZUNzc3IDEzNDZUODI4IDEzNjBRODg0IDEzNjAgOTEyIDEzMjVUOTQ0IDEyNDVROTQ0IDEyMjAgOTMyIDEyMDVUOTA5IDExODZUODg3IDExODNRODY2IDExODMgODQ5IDExOThUODMyIDEyMzlRODMyIDEyODcgODg1IDEyOTZMODgyIDEzMDBRODc5IDEzMDMgODc0IDEzMDdUODY2IDEzMTNRODUxIDEzMjMgODMzIDEzMjNRODE5IDEzMjMgODA3IDEzMTFUNzc1IDEyNTVUNzM2IDExMzlUNjg5IDkzNlQ2MzMgNjI4UTU3NCAyOTMgNTEwIC01VDQxMCAtNDM3VDM1NSAtNjI5UTI3OCAtODYyIDE2NSAtODYyUTEyNSAtODYyIDkyIC04MzFUNTUgLTc0NlE1NSAtNzExIDc0IC02OThUMTEyIC02ODVRMTMzIC02ODUgMTUwIC03MDBUMTY3IC03NDFRMTY3IC03ODkgMTE0IC03OThaIj48L3BhdGg+CjxwYXRoIHN0cm9rZS13aWR0aD0iMSIgaWQ9IkUxLU1KTUFUSEktNjIiIGQ9Ik03MyA2NDdRNzMgNjU3IDc3IDY3MFQ4OSA2ODNROTAgNjgzIDE2MSA2ODhUMjM0IDY5NFEyNDYgNjk0IDI0NiA2ODVUMjEyIDU0MlEyMDQgNTA4IDE5NSA0NzJUMTgwIDQxOEwxNzYgMzk5UTE3NiAzOTYgMTgyIDQwMlEyMzEgNDQyIDI4MyA0NDJRMzQ1IDQ0MiAzODMgMzk2VDQyMiAyODBRNDIyIDE2OSAzNDMgNzlUMTczIC0xMVExMjMgLTExIDgyIDI3VDQwIDE1MFYxNTlRNDAgMTgwIDQ4IDIxN1Q5NyA0MTRRMTQ3IDYxMSAxNDcgNjIzVDEwOSA2MzdRMTA0IDYzNyAxMDEgNjM3SDk2UTg2IDYzNyA4MyA2MzdUNzYgNjQwVDczIDY0N1pNMzM2IDMyNVYzMzFRMzM2IDQwNSAyNzUgNDA1UTI1OCA0MDUgMjQwIDM5N1QyMDcgMzc2VDE4MSAzNTJUMTYzIDMzMEwxNTcgMzIyTDEzNiAyMzZRMTE0IDE1MCAxMTQgMTE0UTExNCA2NiAxMzggNDJRMTU0IDI2IDE3OCAyNlEyMTEgMjYgMjQ1IDU4UTI3MCA4MSAyODUgMTE0VDMxOCAyMTlRMzM2IDI5MSAzMzYgMzI1WiI+PC9wYXRoPgo8cGF0aCBzdHJva2Utd2lkdGg9IjEiIGlkPSJFMS1NSk1BVEhJLTYxIiBkPSJNMzMgMTU3UTMzIDI1OCAxMDkgMzQ5VDI4MCA0NDFRMzMxIDQ0MSAzNzAgMzkyUTM4NiA0MjIgNDE2IDQyMlE0MjkgNDIyIDQzOSA0MTRUNDQ5IDM5NFE0NDkgMzgxIDQxMiAyMzRUMzc0IDY4UTM3NCA0MyAzODEgMzVUNDAyIDI2UTQxMSAyNyA0MjIgMzVRNDQzIDU1IDQ2MyAxMzFRNDY5IDE1MSA0NzMgMTUyUTQ3NSAxNTMgNDgzIDE1M0g0ODdRNTA2IDE1MyA1MDYgMTQ0UTUwNiAxMzggNTAxIDExN1Q0ODEgNjNUNDQ5IDEzUTQzNiAwIDQxNyAtOFE0MDkgLTEwIDM5MyAtMTBRMzU5IC0xMCAzMzYgNVQzMDYgMzZMMzAwIDUxUTI5OSA1MiAyOTYgNTBRMjk0IDQ4IDI5MiA0NlEyMzMgLTEwIDE3MiAtMTBRMTE3IC0xMCA3NSAzMFQzMyAxNTdaTTM1MSAzMjhRMzUxIDMzNCAzNDYgMzUwVDMyMyAzODVUMjc3IDQwNVEyNDIgNDA1IDIxMCAzNzRUMTYwIDI5M1ExMzEgMjE0IDExOSAxMjlRMTE5IDEyNiAxMTkgMTE4VDExOCAxMDZRMTE4IDYxIDEzNiA0NFQxNzkgMjZRMjE3IDI2IDI1NCA1OVQyOTggMTEwUTMwMCAxMTQgMzI1IDIxN1QzNTEgMzI4WiI+PC9wYXRoPgo8cGF0aCBzdHJva2Utd2lkdGg9IjEiIGlkPSJFMS1NSk1BVEhJLTY2IiBkPSJNMTE4IC0xNjJRMTIwIC0xNjIgMTI0IC0xNjRUMTM1IC0xNjdUMTQ3IC0xNjhRMTYwIC0xNjggMTcxIC0xNTVUMTg3IC0xMjZRMTk3IC05OSAyMjEgMjdUMjY3IDI2N1QyODkgMzgyVjM4NUgyNDJRMTk1IDM4NSAxOTIgMzg3UTE4OCAzOTAgMTg4IDM5N0wxOTUgNDI1UTE5NyA0MzAgMjAzIDQzMFQyNTAgNDMxUTI5OCA0MzEgMjk4IDQzMlEyOTggNDM0IDMwNyA0ODJUMzE5IDU0MFEzNTYgNzA1IDQ2NSA3MDVRNTAyIDcwMyA1MjYgNjgzVDU1MCA2MzBRNTUwIDU5NCA1MjkgNTc4VDQ4NyA1NjFRNDQzIDU2MSA0NDMgNjAzUTQ0MyA2MjIgNDU0IDYzNlQ0NzggNjU3TDQ4NyA2NjJRNDcxIDY2OCA0NTcgNjY4UTQ0NSA2NjggNDM0IDY1OFQ0MTkgNjMwUTQxMiA2MDEgNDAzIDU1MlQzODcgNDY5VDM4MCA0MzNRMzgwIDQzMSA0MzUgNDMxUTQ4MCA0MzEgNDg3IDQzMFQ0OTggNDI0UTQ5OSA0MjAgNDk2IDQwN1Q0OTEgMzkxUTQ4OSAzODYgNDgyIDM4NlQ0MjggMzg1SDM3MkwzNDkgMjYzUTMwMSAxNSAyODIgLTQ3UTI1NSAtMTMyIDIxMiAtMTczUTE3NSAtMjA1IDEzOSAtMjA1UTEwNyAtMjA1IDgxIC0xODZUNTUgLTEzMlE1NSAtOTUgNzYgLTc4VDExOCAtNjFRMTYyIC02MSAxNjIgLTEwM1ExNjIgLTEyMiAxNTEgLTEzNlQxMjcgLTE1N0wxMTggLTE2MloiPjwvcGF0aD4KPHBhdGggc3Ryb2tlLXdpZHRoPSIxIiBpZD0iRTEtTUpNQUlOLTI4IiBkPSJNOTQgMjUwUTk0IDMxOSAxMDQgMzgxVDEyNyA0ODhUMTY0IDU3NlQyMDIgNjQzVDI0NCA2OTVUMjc3IDcyOVQzMDIgNzUwSDMxNUgzMTlRMzMzIDc1MCAzMzMgNzQxUTMzMyA3MzggMzE2IDcyMFQyNzUgNjY3VDIyNiA1ODFUMTg0IDQ0M1QxNjcgMjUwVDE4NCA1OFQyMjUgLTgxVDI3NCAtMTY3VDMxNiAtMjIwVDMzMyAtMjQxUTMzMyAtMjUwIDMxOCAtMjUwSDMxNUgzMDJMMjc0IC0yMjZRMTgwIC0xNDEgMTM3IC0xNFQ5NCAyNTBaIj48L3BhdGg+CjxwYXRoIHN0cm9rZS13aWR0aD0iMSIgaWQ9IkUxLU1KTUFUSEktNzgiIGQ9Ik01MiAyODlRNTkgMzMxIDEwNiAzODZUMjIyIDQ0MlEyNTcgNDQyIDI4NiA0MjRUMzI5IDM3OVEzNzEgNDQyIDQzMCA0NDJRNDY3IDQ0MiA0OTQgNDIwVDUyMiAzNjFRNTIyIDMzMiA1MDggMzE0VDQ4MSAyOTJUNDU4IDI4OFE0MzkgMjg4IDQyNyAyOTlUNDE1IDMyOFE0MTUgMzc0IDQ2NSAzOTFRNDU0IDQwNCA0MjUgNDA0UTQxMiA0MDQgNDA2IDQwMlEzNjggMzg2IDM1MCAzMzZRMjkwIDExNSAyOTAgNzhRMjkwIDUwIDMwNiAzOFQzNDEgMjZRMzc4IDI2IDQxNCA1OVQ0NjMgMTQwUTQ2NiAxNTAgNDY5IDE1MVQ0ODUgMTUzSDQ4OVE1MDQgMTUzIDUwNCAxNDVRNTA0IDE0NCA1MDIgMTM0UTQ4NiA3NyA0NDAgMzNUMzMzIC0xMVEyNjMgLTExIDIyNyA1MlExODYgLTEwIDEzMyAtMTBIMTI3UTc4IC0xMCA1NyAxNlQzNSA3MVEzNSAxMDMgNTQgMTIzVDk5IDE0M1ExNDIgMTQzIDE0MiAxMDFRMTQyIDgxIDEzMCA2NlQxMDcgNDZUOTQgNDFMOTEgNDBROTEgMzkgOTcgMzZUMTEzIDI5VDEzMiAyNlExNjggMjYgMTk0IDcxUTIwMyA4NyAyMTcgMTM5VDI0NSAyNDdUMjYxIDMxM1EyNjYgMzQwIDI2NiAzNTJRMjY2IDM4MCAyNTEgMzkyVDIxNyA0MDRRMTc3IDQwNCAxNDIgMzcyVDkzIDI5MFE5MSAyODEgODggMjgwVDcyIDI3OEg1OFE1MiAyODQgNTIgMjg5WiI+PC9wYXRoPgo8cGF0aCBzdHJva2Utd2lkdGg9IjEiIGlkPSJFMS1NSk1BSU4tMjkiIGQ9Ik02MCA3NDlMNjQgNzUwUTY5IDc1MCA3NCA3NTBIODZMMTE0IDcyNlEyMDggNjQxIDI1MSA1MTRUMjk0IDI1MFEyOTQgMTgyIDI4NCAxMTlUMjYxIDEyVDIyNCAtNzZUMTg2IC0xNDNUMTQ1IC0xOTRUMTEzIC0yMjdUOTAgLTI0NlE4NyAtMjQ5IDg2IC0yNTBINzRRNjYgLTI1MCA2MyAtMjUwVDU4IC0yNDdUNTUgLTIzOFE1NiAtMjM3IDY2IC0yMjVRMjIxIC02NCAyMjEgMjUwVDY2IDcyNVE1NiA3MzcgNTUgNzM4UTU1IDc0NiA2MCA3NDlaIj48L3BhdGg+CjxwYXRoIHN0cm9rZS13aWR0aD0iMSIgaWQ9IkUxLU1KTUFUSEktNjQiIGQ9Ik0zNjYgNjgzUTM2NyA2ODMgNDM4IDY4OFQ1MTEgNjk0UTUyMyA2OTQgNTIzIDY4NlE1MjMgNjc5IDQ1MCAzODRUMzc1IDgzVDM3NCA2OFEzNzQgMjYgNDAyIDI2UTQxMSAyNyA0MjIgMzVRNDQzIDU1IDQ2MyAxMzFRNDY5IDE1MSA0NzMgMTUyUTQ3NSAxNTMgNDgzIDE1M0g0ODdINDkxUTUwNiAxNTMgNTA2IDE0NVE1MDYgMTQwIDUwMyAxMjlRNDkwIDc5IDQ3MyA0OFQ0NDUgOFQ0MTcgLThRNDA5IC0xMCAzOTMgLTEwUTM1OSAtMTAgMzM2IDVUMzA2IDM2TDMwMCA1MVEyOTkgNTIgMjk2IDUwUTI5NCA0OCAyOTIgNDZRMjMzIC0xMCAxNzIgLTEwUTExNyAtMTAgNzUgMzBUMzMgMTU3UTMzIDIwNSA1MyAyNTVUMTAxIDM0MVExNDggMzk4IDE5NSA0MjBUMjgwIDQ0MlEzMzYgNDQyIDM2NCA0MDBRMzY5IDM5NCAzNjkgMzk2UTM3MCA0MDAgMzk2IDUwNVQ0MjQgNjE2UTQyNCA2MjkgNDE3IDYzMlQzNzggNjM3SDM1N1EzNTEgNjQzIDM1MSA2NDVUMzUzIDY2NFEzNTggNjgzIDM2NiA2ODNaTTM1MiAzMjZRMzI5IDQwNSAyNzcgNDA1UTI0MiA0MDUgMjEwIDM3NFQxNjAgMjkzUTEzMSAyMTQgMTE5IDEyOVExMTkgMTI2IDExOSAxMThUMTE4IDEwNlExMTggNjEgMTM2IDQ0VDE3OSAyNlEyMzMgMjYgMjkwIDk4TDI5OCAxMDlMMzUyIDMyNloiPjwvcGF0aD4KPHBhdGggc3Ryb2tlLXdpZHRoPSIxIiBpZD0iRTEtTUpNQUlOLTIyNDgiIGQ9Ik01NSAzMTlRNTUgMzYwIDcyIDM5M1QxMTQgNDQ0VDE2MyA0NzJUMjA1IDQ4MlEyMDcgNDgyIDIxMyA0ODJUMjIzIDQ4M1EyNjIgNDgzIDI5NiA0NjhUMzkzIDQxM0w0NDMgMzgxUTUwMiAzNDYgNTUzIDM0NlE2MDkgMzQ2IDY0OSAzNzVUNjk0IDQ1NFE2OTQgNDY1IDY5OCA0NzRUNzA4IDQ4M1E3MjIgNDgzIDcyMiA0NTJRNzIyIDM4NiA2NzUgMzM4VDU1NSAyODlRNTE0IDI4OSA0NjggMzEwVDM4OCAzNTdUMzA4IDQwNFQyMjQgNDI2UTE2NCA0MjYgMTI1IDM5M1Q4MyAzMThRODEgMjg5IDY5IDI4OVE1NSAyODkgNTUgMzE5Wk01NSA4NVE1NSAxMjYgNzIgMTU5VDExNCAyMTBUMTYzIDIzOFQyMDUgMjQ4UTIwNyAyNDggMjEzIDI0OFQyMjMgMjQ5UTI2MiAyNDkgMjk2IDIzNFQzOTMgMTc5TDQ0MyAxNDdRNTAyIDExMiA1NTMgMTEyUTYwOSAxMTIgNjQ5IDE0MVQ2OTQgMjIwUTY5NCAyNDkgNzA4IDI0OVQ3MjIgMjE3UTcyMiAxNTMgNjc1IDEwNFQ1NTUgNTVRNTE0IDU1IDQ2OCA3NlQzODggMTIzVDMwOCAxNzBUMjI0IDE5MlExNjQgMTkyIDEyNSAxNTlUODMgODRRODAgNTUgNjkgNTVRNTUgNTUgNTUgODVaIj48L3BhdGg+CjxwYXRoIHN0cm9rZS13aWR0aD0iMSIgaWQ9IkUxLU1KTUFJTi0yMjEyIiBkPSJNODQgMjM3VDg0IDI1MFQ5OCAyNzBINjc5UTY5NCAyNjIgNjk0IDI1MFQ2NzkgMjMwSDk4UTg0IDIzNyA4NCAyNTBaIj48L3BhdGg+CjxwYXRoIHN0cm9rZS13aWR0aD0iMSIgaWQ9IkUxLU1KTUFJTi0yMkM1IiBkPSJNNzggMjUwUTc4IDI3NCA5NSAyOTJUMTM4IDMxMFExNjIgMzEwIDE4MCAyOTRUMTk5IDI1MVExOTkgMjI2IDE4MiAyMDhUMTM5IDE5MFQ5NiAyMDdUNzggMjUwWiI+PC9wYXRoPgo8cGF0aCBzdHJva2Utd2lkdGg9IjEiIGlkPSJFMS1NSk1BSU4tMkIiIGQ9Ik01NiAyMzdUNTYgMjUwVDcwIDI3MEgzNjlWNDIwTDM3MCA1NzBRMzgwIDU4MyAzODkgNTgzUTQwMiA1ODMgNDA5IDU2OFYyNzBINzA3UTcyMiAyNjIgNzIyIDI1MFQ3MDcgMjMwSDQwOVYtNjhRNDAxIC04MiAzOTEgLTgySDM4OUgzODdRMzc1IC04MiAzNjkgLTY4VjIzMEg3MFE1NiAyMzcgNTYgMjUwWiI+PC9wYXRoPgo8cGF0aCBzdHJva2Utd2lkdGg9IjEiIGlkPSJFMS1NSk1BSU4tMzIiIGQ9Ik0xMDkgNDI5UTgyIDQyOSA2NiA0NDdUNTAgNDkxUTUwIDU2MiAxMDMgNjE0VDIzNSA2NjZRMzI2IDY2NiAzODcgNjEwVDQ0OSA0NjVRNDQ5IDQyMiA0MjkgMzgzVDM4MSAzMTVUMzAxIDI0MVEyNjUgMjEwIDIwMSAxNDlMMTQyIDkzTDIxOCA5MlEzNzUgOTIgMzg1IDk3UTM5MiA5OSA0MDkgMTg2VjE4OUg0NDlWMTg2UTQ0OCAxODMgNDM2IDk1VDQyMSAzVjBINTBWMTlWMzFRNTAgMzggNTYgNDZUODYgODFRMTE1IDExMyAxMzYgMTM3UTE0NSAxNDcgMTcwIDE3NFQyMDQgMjExVDIzMyAyNDRUMjYxIDI3OFQyODQgMzA4VDMwNSAzNDBUMzIwIDM2OVQzMzMgNDAxVDM0MCA0MzFUMzQzIDQ2NFEzNDMgNTI3IDMwOSA1NzNUMjEyIDYxOVExNzkgNjE5IDE1NCA2MDJUMTE5IDU2OVQxMDkgNTUwUTEwOSA1NDkgMTE0IDU0OVExMzIgNTQ5IDE1MSA1MzVUMTcwIDQ4OVExNzAgNDY0IDE1NCA0NDdUMTA5IDQyOVoiPjwvcGF0aD4KPC9kZWZzPgo8ZyBzdHJva2U9ImN1cnJlbnRDb2xvciIgZmlsbD0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAiIHRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMCkiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KU1oyLTIyMkIiIHg9IjAiIHk9IjAiPjwvdXNlPgogPHVzZSB0cmFuc2Zvcm09InNjYWxlKDAuNzA3KSIgeGxpbms6aHJlZj0iI0UxLU1KTUFUSEktNjIiIHg9IjE1MDAiIHk9IjE1NDAiPjwvdXNlPgogPHVzZSB0cmFuc2Zvcm09InNjYWxlKDAuNzA3KSIgeGxpbms6aHJlZj0iI0UxLU1KTUFUSEktNjEiIHg9Ijc4NyIgeT0iLTEyNzAiPjwvdXNlPgogPHVzZSB4bGluazpocmVmPSIjRTEtTUpNQVRISS02NiIgeD0iMTYzMSIgeT0iMCI+PC91c2U+CiA8dXNlIHhsaW5rOmhyZWY9IiNFMS1NSk1BSU4tMjgiIHg9IjIxODEiIHk9IjAiPjwvdXNlPgogPHVzZSB4bGluazpocmVmPSIjRTEtTUpNQVRISS03OCIgeD0iMjU3MSIgeT0iMCI+PC91c2U+CiA8dXNlIHhsaW5rOmhyZWY9IiNFMS1NSk1BSU4tMjkiIHg9IjMxNDMiIHk9IjAiPjwvdXNlPgogPHVzZSB4bGluazpocmVmPSIjRTEtTUpNQVRISS02NCIgeD0iMzY5OSIgeT0iMCI+PC91c2U+CiA8dXNlIHhsaW5rOmhyZWY9IiNFMS1NSk1BVEhJLTc4IiB4PSI0MjIzIiB5PSIwIj48L3VzZT4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KTUFJTi0yMjQ4IiB4PSI1MDczIiB5PSIwIj48L3VzZT4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KTUFJTi0yOCIgeD0iNjEzMCIgeT0iMCI+PC91c2U+CiA8dXNlIHhsaW5rOmhyZWY9IiNFMS1NSk1BVEhJLTYyIiB4PSI2NTE5IiB5PSIwIj48L3VzZT4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KTUFJTi0yMjEyIiB4PSI3MTcxIiB5PSIwIj48L3VzZT4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KTUFUSEktNjEiIHg9IjgxNzEiIHk9IjAiPjwvdXNlPgogPHVzZSB4bGluazpocmVmPSIjRTEtTUpNQUlOLTI5IiB4PSI4NzAxIiB5PSIwIj48L3VzZT4KIDx1c2UgeGxpbms6aHJlZj0iI0UxLU1KTUFJTi0yMkM1IiB4PSI5MzEzIiB5PSIwIj48L3VzZT4KPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTgxMywwKSI+CjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwwKSI+CjxyZWN0IHN0cm9rZT0ibm9uZSIgd2lkdGg9IjMyMjgiIGhlaWdodD0iNjAiIHg9IjAiIHk9IjIyMCI+PC9yZWN0Pgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MCw2MjIpIj4KIDx1c2UgdHJhbnNmb3JtPSJzY2FsZSgwLjcwNykiIHhsaW5rOmhyZWY9IiNFMS1NSk1BVEhJLTY2IiB4PSIwIiB5PSIwIj48L3VzZT4KIDx1c2UgdHJhbnNmb3JtPSJzY2FsZSgwLjcwNykiIHhsaW5rOmhyZWY9IiNFMS1NSk1BSU4tMjgiIHg9IjU1MCIgeT0iMCI+PC91c2U+CiA8dXNlIHRyYW5zZm9ybT0ic2NhbGUoMC43MDcpIiB4bGluazpocmVmPSIjRTEtTUpNQVRISS02MSIgeD0iOTQwIiB5PSIwIj48L3VzZT4KIDx1c2UgdHJhbnNmb3JtPSJzY2FsZSgwLjcwNykiIHhsaW5rOmhyZWY9IiNFMS1NSk1BSU4tMjkiIHg9IjE0NjkiIHk9IjAiPjwvdXNlPgogPHVzZSB0cmFuc2Zvcm09InNjYWxlKDAuNzA3KSIgeGxpbms6aHJlZj0iI0UxLU1KTUFJTi0yQiIgeD0iMTg1OSIgeT0iMCI+PC91c2U+CiA8dXNlIHRyYW5zZm9ybT0ic2NhbGUoMC43MDcpIiB4bGluazpocmVmPSIjRTEtTUpNQVRISS02NiIgeD0iMjYzNyIgeT0iMCI+PC91c2U+CiA8dXNlIHRyYW5zZm9ybT0ic2NhbGUoMC43MDcpIiB4bGluazpocmVmPSIjRTEtTUpNQUlOLTI4IiB4PSIzMTg4IiB5PSIwIj48L3VzZT4KIDx1c2UgdHJhbnNmb3JtPSJzY2FsZSgwLjcwNykiIHhsaW5rOmhyZWY9IiNFMS1NSk1BVEhJLTYyIiB4PSIzNTc3IiB5PSIwIj48L3VzZT4KIDx1c2UgdHJhbnNmb3JtPSJzY2FsZSgwLjcwNykiIHhsaW5rOmhyZWY9IiNFMS1NSk1BSU4tMjkiIHg9IjQwMDciIHk9IjAiPjwvdXNlPgo8L2c+CiA8dXNlIHRyYW5zZm9ybT0ic2NhbGUoMC43MDcpIiB4bGluazpocmVmPSIjRTEtTUpNQUlOLTMyIiB4PSIyMDMyIiB5PSItNTg5Ij48L3VzZT4KPC9nPgo8L2c+CjwvZz4KPC9zdmc+"}}},{"metadata":{},"cell_type":"markdown","source":"\n![440px-Trapezoidal_rule_illustration.svg.png](attachment:440px-Trapezoidal_rule_illustration.svg.png)","attachments":{"440px-Trapezoidal_rule_illustration.svg.png":{"image/png":"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"}}},{"metadata":{},"cell_type":"markdown","source":"### In our case, the x-axis is the slice location (ImagePositionPatient[2] from dcm meta information), y-axis is the lung-area, applying trapezoidal method give as an approximate of lung volume"},{"metadata":{},"cell_type":"markdown","source":"## Lung Volume Calculus"},{"metadata":{"trusted":true},"cell_type":"code","source":"class Detector:\n    def __call__(self, x):\n        raise NotImplementedError('Abstract') \n        \nclass ThrDetector(Detector):\n    def __init__(self, thr=-400):\n        self.thr = thr\n        \n    def __call__(self, x):\n        try:\n            x = pydicom.dcmread(x)\n            img = x.pixel_array\n            img = (img + x.RescaleIntercept) / x.RescaleSlope\n            img = img < self.thr\n            \n            img = clear_border(img)\n            img = label(img)\n            areas = [r.area for r in regionprops(img)]\n            areas.sort()\n            if len(areas) > 2:\n                for region in regionprops(img):\n                    if region.area < areas[-2]:\n                        for coordinates in region.coords:                \n                            img[coordinates[0], coordinates[1]] = 0\n                            \n            area = (img > 0).sum() * x.PixelSpacing[0] * x.PixelSpacing[1] # scale the detected lung area according the the pixel spacing value\n            \n        except:\n            area = np.nan\n\n        try:\n            loc = x.ImagePositionPatient[2]\n        except:\n            loc = np.nan\n\n        return area, loc\n  \nclass Integral:\n    def __init__(self, detector: Detector):\n        self.detector = detector\n    \n    def __call__(self, xs):\n        raise NotImplementedError('Abstract')\n        \n\nclass AreaIntegral(Integral):\n    def __call__(self, xs):\n        \n        with Pool(4) as p:\n            areas, locs = map(list, zip(*p.map(self.detector, xs) ))\n        \n        filt = (~np.isnan(locs)) & (~np.isnan(areas))\n        areas = np.array(areas)[filt]\n        locs = np.array(locs)[filt]\n        seq_idx = np.argsort(locs)\n\n        return np.trapz(y=areas[seq_idx], x=locs[seq_idx])/1000","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/osic-pulmonary-fibrosis-progression/train.csv')\ntrain_data = {}\nfor p in train.Patient.values:\n    train_data[p] = os.listdir(f'../input/osic-pulmonary-fibrosis-progression/train/{p}/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"keys = list(train_data.keys()) #[k for k in list(train_data.keys()) if k not in ['ID00011637202177653955184', 'ID00052637202186188008618']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"integral = AreaIntegral(ThrDetector()) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"volume = {}\nfor k in tqdm(keys, total=len(keys)):\n    x = []\n    for i in train_data[k]:\n        x.append(f'../input/osic-pulmonary-fibrosis-progression/train/{k}/{i}') \n    volume[k] = integral(x)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for k in tqdm(train.Patient.values):\n    #if k in ['ID00011637202177653955184', 'ID00052637202186188008618']:\n    #    continue\n    train.loc[train.Patient == k,'v'] = volume[k]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(10, 10))\nplt.xlabel('v')\nplt.ylabel('FVC')\nplt.plot(train.v, train.FVC, '.')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[['v', 'FVC']].corr('spearman')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Some Observations and Conclusions"},{"metadata":{},"cell_type":"markdown","source":"1. As we could see, most of time, when lung volume increases, the FVC increases as well (High spearman\\ranking correlations)\n2. For **straight lines**, they are from the same patient, but the FVC is taken at different timing\n3. However, there are some outliers need to be further investigated"},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.to_pickle(volume, 'patient_lung_volume.pkl') # for readers to integrate with their modeling :D","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}