{"cells":[{"metadata":{},"cell_type":"markdown","source":"# FIBROSIS PULMONAR - Kaggle Competition \n\nhttps://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/overview"},{"metadata":{},"cell_type":"markdown","source":"Data Description\n\nThe aim of this competition is to predict a patient’s severity of decline in lung function based on a CT scan of their lungs. Lung function is assessed based on output from a spirometer, which measures the forced vital capacity (`FVC`), i.e. the volume of air exhaled.\n\nIn the dataset, you are provided with a baseline chest CT scan and associated clinical information for a set of patients. A patient has an image acquired at time  `Week = 0`  and has numerous follow up visits over the course of approximately 1-2 years, at which time their  `FVC`  is measured.\n\n-   In the training set, you are provided with an anonymized, baseline CT scan and the entire history of FVC measurements.\n-   In the test set, you are provided with a baseline CT scan and only the initial FVC measurement.  **You are asked to predict the final three  `FVC`  measurements for each patient, as well as a confidence value in your prediction.**\n\nSince this is real medical data, you will notice the relative timing of  `FVC`  measurements varies widely. The timing of the initial measurement relative to the CT scan and the duration to the forecasted time points may be different for each patient. This is considered part of the challenge of the competition. To avoid potential leakage in the timing of follow up visits, you are asked to predict every patient's  `FVC`  measurement for every possible week. Those weeks which are not in the final three visits are ignored in scoring.\n\n## Files\n\nThis is a synchronous rerun code competition. The provided test set is a small representative set of files (copied from the training set) to demonstrate the format of the private test set. When you submit your notebook, Kaggle will rerun your code on the test set, which contains unseen images.\n\n-   **train.csv**  - the training set, contains full history of clinical information\n-   **test.csv**  - the test set, contains only the baseline measurement\n-   **train/**  - contains the training patients' baseline CT scan in DICOM format\n-   **test/**  - contains the test patients' baseline CT scan in DICOM format\n-   **sample_submission.csv**  - demonstrates the submission format\n\n## Columns\n\n### train.csv and test.csv\n\n-   `Patient`- a unique Id for each patient (also the name of the patient's DICOM folder)\n-   `Weeks`- the relative number of weeks pre/post the baseline CT (may be negative)\n-   `FVC`  - the recorded lung capacity in ml\n-   `Percent`- a computed field which approximates the patient's FVC as a percent of the typical FVC for a person of similar characteristics\n-   `Age`\n-   `Sex`\n-   `SmokingStatus`"},{"metadata":{},"cell_type":"markdown","source":"# Fibrosis pulmonar\n\nLa fibrosis pulmonar es una afección en donde el tejido profundo de sus pulmones se va cicatrizando. Esto hace que el tejido se vuelva grueso y duro. Esto dificulta recuperar el aliento y es posible que la sangre no reciba suficiente oxígeno.\n\nLas causas de la fibrosis pulmonar incluyen contaminantes ambientales, algunos medicamentos, enfermedades del tejido conectivo o la enfermedad pulmonar intersticial (grupo de enfermedades que causan inflamación o cicatrización en los pulmones) pero en la mayoría de los casos, no se encuentra una causa. Esto se llama fibrosis pulmonar idiopática.\n\n![Fibrosis pulmonar - Síntomas y causas - Mayo Clinic](https://www.mayoclinic.org/-/media/kcms/gbs/patient-consumer/images/2016/08/10/14/57/mcdc7_pulmonaryfibrosis-8col.jpg)\n\nLa espirometría forzada es aquella en que, tras una inspiración máxima, se le pide al paciente que realice una espiración de todo el aire, en el menor tiempo posible. Nos permite establecer diagnósticos de la patología respiratoria. \n\n - Capacidad vital forzada (FVC) (se expresa en mililitros): Volumen total que expulsa el paciente desde la inspiración máxima hasta la espiración máxima. Su valor normal es mayor del 80% del valor teórico."},{"metadata":{},"cell_type":"markdown","source":"[  \nhttps://www.elsevier.es/es-revista-atencion-primaria-27-articulo-principales-parametros-funcion-pulmonar-enfermedad-13049899](https://www.elsevier.es/es-revista-atencion-primaria-27-articulo-principales-parametros-funcion-pulmonar-enfermedad-13049899)  \n[https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/172022](https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/172022)  [https://erj.ersjournals.com/content/40/6/1324](https://erj.ersjournals.com/content/40/6/1324)  [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2643211/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2643211/)  [https://vitalograph.co.uk/resources/ers-normal-values](https://vitalograph.co.uk/resources/ers-normal-values)"},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport os\nfrom matplotlib import style\n\n%matplotlib inline\nstyle.use('fivethirtyeight')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dir_train_dicom = '../input/osic-pulmonary-fibrosis-progression/train'\ndir_test_dicom = '../input/osic-pulmonary-fibrosis-progression/test'\n\ndir_train_csv = '../input/osic-pulmonary-fibrosis-progression/train.csv'\ndir_test_csv = '../input/osic-pulmonary-fibrosis-progression/test.csv'\n\ndir_submission_csv = '../input/osic-pulmonary-fibrosis-progression/sample_submission.csv'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv(dir_train_csv)\ntest = pd.read_csv(dir_test_csv)\nsample_submission = pd.read_csv(dir_submission_csv)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Patient.nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train.FVC)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train.Age, color='g')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train.Weeks, color='r')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Outliers"},{"metadata":{"trusted":true},"cell_type":"code","source":"f, axes = plt.subplots(4, figsize=(15, 15))\nsns.boxplot(train.FVC, ax=axes[0])\nsns.boxplot(train.Age, color='g', ax=axes[1])\nsns.boxplot(train.Percent, color='y', ax=axes[2])\nsns.boxplot(train.Weeks, color='r', ax=axes[3])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Relaciones existentes por sexo"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.pairplot(train, hue='Sex')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(x=train.Sex)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Porcentaje_hombres = train.Sex[train.Sex=='Male'].count()/len(train.Sex)\nPorcentaje_mujeres = train.Sex[train.Sex=='Female'].count()/len(train.Sex)\n\nprint(f'Porcentaje train HOMBRES: {Porcentaje_hombres}')\nprint(f'Porcentaje train MUJERES: {Porcentaje_mujeres}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Porcentaje_hombres = test.Sex[train.Sex=='Male'].count()/len(test.Sex)\nPorcentaje_mujeres = test.Sex[train.Sex=='Female'].count()/len(test.Sex)\n\nprint(f'Porcentaje test HOMBRES: {Porcentaje_hombres}')\nprint(f'Porcentaje test MUJERES: {Porcentaje_mujeres}')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Relaciones existentes por Smoking Status"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(train.SmokingStatus)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Porcentaje_exfumadores = train.SmokingStatus[train.SmokingStatus=='Ex-smoker'].count()/len(train.SmokingStatus)\nPorcentaje_nuncafumaron = train.SmokingStatus[train.SmokingStatus=='Never smoked'].count()/len(train.SmokingStatus)\nPorcentaje_fuman = train.SmokingStatus[train.SmokingStatus=='Currently smokes'].count()/len(train.SmokingStatus)\n\nprint(f'Porcentaje train EX-FUMADORES: {Porcentaje_exfumadores}')\nprint(f'Porcentaje train NUNCA FUMARON: {Porcentaje_nuncafumaron}')\nprint(f'Porcentaje train FUMAN: {Porcentaje_fuman}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Porcentaje_exfumadores = test.SmokingStatus[test.SmokingStatus=='Ex-smoker'].count()/len(test.SmokingStatus)\nPorcentaje_nuncafumaron = test.SmokingStatus[test.SmokingStatus=='Never smoked'].count()/len(test.SmokingStatus)\nPorcentaje_fuman = test.SmokingStatus[test.SmokingStatus=='Currently smokes'].count()/len(test.SmokingStatus)\n\nprint(f'Porcentaje test EX-FUMADORES: {Porcentaje_exfumadores}')\nprint(f'Porcentaje test NUNCA FUMARON: {Porcentaje_nuncafumaron}')\nprint(f'Porcentaje test FUMAN: {Porcentaje_fuman}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.pairplot(train, hue='SmokingStatus')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Correlaciones "},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.heatmap(train.corr(), annot=True, fmt='.2f', cmap='YlGnBu')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Edades mujeres"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Sex[train.Sex=='Female'].groupby(train.Age).value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train.Age[train.Sex=='Female'].values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Age[train.Sex=='Female'].describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Edades hombres"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Sex[train.Sex=='Male'].groupby(train.Age).value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train.Age[train.Sex=='Male'].values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Age[train.Sex=='Male'].describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Relaciones de acuerdo al FVC"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.set(rc={'figure.figsize':(15,10)})\n\nsns.distplot(train[train.SmokingStatus == 'Ex-smoker'].FVC)\nsns.distplot(train[train.SmokingStatus =='Never smoked'].FVC)\nsns.distplot(train[train.SmokingStatus =='Currently smokes'].FVC)\n\nplt.legend(['Ex-smoker','Never smoked','Currently smokes'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train[train.Sex =='Female'].FVC)\nsns.distplot(train[train.Sex =='Male'].FVC)\n\nplt.legend(['Female','Male'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train.Weeks.max(), train.Weeks.min())\nprint(np.linspace(train.Weeks.max(), train.Weeks.min(), 6))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train[train.Weeks<=23].FVC)\nsns.distplot(train[(train.Weeks>23)&(train.Weeks<=50)].FVC)\nsns.distplot(train[(train.Weeks>50)&(train.Weeks<=78)].FVC)\nsns.distplot(train[(train.Weeks>78)&(train.Weeks<=105)].FVC)\nsns.distplot(train[(train.Weeks>105)&(train.Weeks<=133)].FVC)\n\nplt.legend(['<23 weeks','23 y 50 weeks','50 y 78 weeks', '78 y 105 weeks', '105 y 133 weeks'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Weeks_cortadas = pd.cut(train[\"Weeks\"], 8)   \ngrupo = train.groupby(train.Weeks_cortadas)\n\nax = sns.barplot(x=train.Weeks_cortadas.unique(), y= grupo.FVC.mean())\nplt.xticks(rotation=45)\n\nfor rect in ax.patches:\n    height = rect.get_height()\n    ax.text(rect.get_x() + rect.get_width()/2., 1*height,'%d' % int(height),ha='center', va='bottom')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train.Age.max(), train.Age.min())\nprint(np.linspace(train.Age.max(), train.Age.min(), 4))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(train[train.Age<=62].FVC)\nsns.distplot(train[(train.Age>62)&(train.Age<=75)].FVC)\nsns.distplot(train[(train.Age>75)&(train.Age<=88)].FVC)\n\nplt.legend(['<62 age','62 y 75 age','75 y 88 age'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Age_cortadas = pd.cut(train[\"Age\"], 6)   \ngrupo = train.groupby(train.Age_cortadas)\n\nax = sns.barplot(x=train.Age_cortadas.unique(), y= grupo.FVC.mean())\nplt.xticks(rotation=45)\n\nfor rect in ax.patches:\n    height = rect.get_height()\n    ax.text(rect.get_x() + rect.get_width()/2., 1*height,'%d' % int(height),ha='center', va='bottom')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.groupby(train.Patient).count().Weeks.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Podemos ver que la mayoria de los pacientes se realizan una CT en la semana 9"},{"metadata":{"trusted":true},"cell_type":"code","source":"f, axes = plt.subplots(1,3, figsize=(20, 10))\n\ngrupo = train.groupby(train.Sex)\n\nax0 = sns.barplot(x=train.Sex.unique(), y= grupo.FVC.min(), ax=axes[0])\nax1 = sns.barplot(x=train.Sex.unique(), y= grupo.FVC.mean(), ax=axes[1])\nax2 = sns.barplot(x=train.Sex.unique(), y= grupo.FVC.max(), ax=axes[2])\n\nfor rect in ax0.patches:\n    height = rect.get_height()\n    ax0.text(rect.get_x() + rect.get_width()/2., 1*height,'%d' % int(height),ha='center', va='bottom')\n    \nfor rect in ax1.patches:\n    height = rect.get_height()\n    ax1.text(rect.get_x() + rect.get_width()/2., 1*height,'%d' % int(height),ha='center', va='bottom')\n\nfor rect in ax2.patches:\n    height = rect.get_height()\n    ax2.text(rect.get_x() + rect.get_width()/2., 1*height,'%d' % int(height),ha='center', va='bottom')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Hay que intercambiar las variables porque el grafico de mujeres corresponde al de hombres y viceversa "},{"metadata":{"trusted":true},"cell_type":"code","source":"ax = sns.barplot(x=train.SmokingStatus, y=train.FVC)\n\nfor rect in ax.patches:\n    height = rect.get_height()\n    ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,'%d' % int(height),ha='center', va='bottom')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"[  \nhttps://www.elsevier.es/es-revista-atencion-primaria-27-articulo-principales-parametros-funcion-pulmonar-enfermedad-13049899](https://www.elsevier.es/es-revista-atencion-primaria-27-articulo-principales-parametros-funcion-pulmonar-enfermedad-13049899)  \n[https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/172022](https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/172022)  [https://erj.ersjournals.com/content/40/6/1324](https://erj.ersjournals.com/content/40/6/1324)  [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2643211/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2643211/)  [https://vitalograph.co.uk/resources/ers-normal-values](https://vitalograph.co.uk/resources/ers-normal-values)"},{"metadata":{},"cell_type":"markdown","source":"A partir del ultimo link deducimos que la FVC max para hombres es de 5960 ml y 4890 para mujeres con una altura maxima de 195 cm"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Age[train.Sex=='Male'].max(), train.Age[train.Sex=='Male'].min()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.Age[train.Sex=='Female'].max(), train.Age[train.Sex=='Female'].min()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[(train.Sex=='Male')&(train.FVC>5960)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[(train.Sex=='Female')&(train.FVC>4890)]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Relacion de FVC vs Weeks para pacientes random"},{"metadata":{"trusted":true},"cell_type":"code","source":"Paciente_0 = train.Patient[0]\nPaciente = train[train.Patient==Paciente_0]\nsns.lineplot(x=Paciente.Weeks, y=Paciente.FVC), \nplt.title(Paciente_0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Paciente_10 = train.Patient[10]\nPaciente = train[train.Patient==Paciente_10]\nsns.lineplot(x=Paciente.Weeks, y=Paciente.FVC), \nplt.title(Paciente_10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Paciente_20 = train.Patient[20]\nPaciente = train[train.Patient==Paciente_20]\nsns.lineplot(x=Paciente.Weeks, y=Paciente.FVC), \nplt.title(Paciente_20)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Utilización de libreria pydicom para trabajar con archivos dicom"},{"metadata":{},"cell_type":"markdown","source":"DICOM (Digital Imaging and Communication On Medicine) es un estándar de transmisión de imágenes médicas y datos entre hardware de propósito médico. Las aplicaciones más comunes de este estándar son la visualización, almacenamiento, impresión y transmisión de las imágenes.\nIndependientemente del uso, siempre se utiliza el mismo formato, incluyendo el uso de ficheros y de red. DICOM se diferencia de otros ficheros de datos en que agrupa la información dentro de un conjunto de datos. Es decir, una radiografía de TORAX contiene el ID de paciente junto con ella, de manera que la imagen no puede ser separada por error de su información.\n\nLos ficheros DICOM consisten en una cabecera con campos estandarizados y de forma libre, y un cuerpo con datos de imagen. \n"},{"metadata":{},"cell_type":"markdown","source":"DICOM es la abreviatura del término en inglés Digital Imaging and Communications in Medicine (Imágenes digitales y comunicaciones en medicina). Es una norma médica que describe cómo debe intercambiarse y administrarse la información relativa a imágenes médicas. Otra norma relacionada es DICOM, apartado 14, publicada por el Colegio Americano de Radiología (ACR, del inglés American College of Radiology) y la Asociación Nacional de Fabricantes Eléctricos (NEMA, del inglés National Electrical Manufacturers Association).\n\nEl apartado 14 de la norma DICOM establece unas estrictas directrices respecto a la forma en que debe realizarse la calibración de la escala de grises y las pruebas de garantía de calidad en los  [monitores utilizados para imágenes médicas](https://www.barco.com/es/glossary/healthcare/medical-display).\n\n![](https://az877327.vo.msecnd.net/~/media/images/healthcare/medical%20glossary/dicom%20jpg.jpg?h=149&w=400&la=es&v=1)"},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"!pip install git+https://github.com/fastai/fastai2 \n!pip install git+https://github.com/fastai/fastcore","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"import pydicom\nfrom fastai2.basics import *\nfrom fastai2.callback.all import *\nfrom fastai2.vision.all import *\nfrom fastai2.medical.imaging import *","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dcm = get_dicom_files(dir_train_dicom)\ntrain_dcm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dcm_random = train_dcm[6]\ndimg = dcmread(dcm_random)\nprint(f'El paciente random es: {dcm_random}\\n') \nprint(dimg)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dimension = (int(dimg.Rows), int(dimg.Columns), len(dimg.PixelData))\ndimension","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dimg.show(figsize=(8,8))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Escala Hounsfield\n\n\nLa  **escala de Unidades Hounsfield**  (‘escala Hounsfield’ o ‘escala de números TC’) nombrada en honor del ingeniero y  [Premio Nobel de Fisiología o Medicina](https://es.wikipedia.org/wiki/Premios_Nobel_de_Fisiolog%C3%ADa_y_Medicina \"Premios Nobel de Fisiología y Medicina\")  inglés  [Sir Godfrey Newbold Hounsfield](https://es.wikipedia.org/wiki/Sir_Godfrey_Newbold_Hounsfield \"Sir Godfrey Newbold Hounsfield\"), es una escala cuantitativa utilizada en los estudios de  [tomografía axial computarizada](https://es.wikipedia.org/wiki/Tomograf%C3%ADa_axial_computarizada \"Tomografía axial computarizada\")  para describir los diferentes niveles de radiodensidad de los tejidos humanos.\n\n\n## Definición\n\nLa escala de Unidades Hounsfield (símbolo  **HU**  del inglés ‘_Hounsfield Units_’) es el resultado de la transformación de la escala de coeficientes de atenuación lineal de rayos X en una nueva escala en la cual el valor de atenuación del agua destilada en Condiciones Normales de Presión y Temperatura ([CNPT](https://es.wikipedia.org/wiki/Condiciones_normales_de_presi%C3%B3n_y_temperatura \"Condiciones normales de presión y temperatura\")) se define como 0 unidades de Hounsfield (HU), mientras que la radiodensidad del aire en Condiciones Normales de Presión y Temperatura (CNPT) se define como -1000 HU, extendiéndose más allá de las 1000 HU asignadas al nivel de absorción del hueso compacto.\n\n## Fórmula\n\nEl coeficiente de atenuación de los rayos X expresado en Unidades Hounsfield para los diferentes tejidos vivos u otros materiales sometidos a un examen tomográfico de rayos X viene dado por la siguiente fórmula:\n\n![{\\displaystyle HU=1000\\times {\\frac {\\mu _{t}-\\mu _{agua}}{\\mu _{agua}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/499d76d1b25e18e4c37001a66c231a186303a567)\n\n![{\\displaystyle \\mu _{agua}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/144765c4e4972847ee8e881d72cf9315266b575e)  es el coeficiente de atenuación lineal del agua destilada y  ![{\\displaystyle \\mu _{t}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d8247e7beb0b3fa21c4fe35defef3a3cf93df67d)  el coeficiente de atenuación lineal del tejido o material de interés.\n\n## Rango absoluto y ventanas\n\nAunque teóricamente la escala Hounsfield es una escala abierta, lo cierto es que en el ámbito del diagnóstico por imagen se ha establecido un rango de valores útiles que abarca desde -1024 HU hasta 3071 HU; estos 4096 niveles de gris pueden representarse mediante un número de 12 bits (212= 4096).\n\nDebido a que la percepción humana solo permite distinguir a simple vista un máximo de 32 niveles diferenciados de gris (25), los valores absolutos registrados por el sistema de rayos X suelen explorarse mediante la generación matemática de ventanas. Una ventana es el resultado de transportar linealmente los valores de un rango de densidades de la escala Hounsfield (12 bits y 4096 niveles) para ser representados en una escala de grises de 32 niveles (5 bits).\n\nLa exploración mediante ventanas permite diferenciar con gran claridad estructuras que poseen una pequeña diferencia expresada en unidades Hounsfield (HU).\n\n## Valor de Unidades Hounsfield (HU) para los tejidos y sustancias del cuerpo humano\n|Sustancia|HU  |\n|--|--|\n| Aire |-1000  |\n| Pulmon|-500  |\n| Grasa|-100 a 55  |\n| Agua| 0  |\n| Liquido Cerebroespinal|15|\n| Riñon|30|\n| Sangre|30 a 45|\n| Musculo|10 a 40|\n| Sustancia Gris|37 a 45|\n| Sustancia Blanca|20 a 30|\n| Higado|40 a 60|\n\n"},{"metadata":{},"cell_type":"markdown","source":"https://stackoverflow.com/questions/8756096/window-width-and-center-calculation-of-dicom-image/8765366#8765366"},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"pix = dimg.pixels.flatten()\nsns.distplot(pix, kde=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"dimg.show(max_px=-500, min_px=-1200, figsize=(8,8))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from skimage.measure import label,regionprops\nfrom skimage.segmentation import clear_border","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"img = clear_border(dimg)\nplt.figure(figsize=(10,10))\nplt.imshow(img, cmap=plt.cm.bone)\nplt.axis('off')","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}