{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport pydicom as dicom","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data visualization: Dataframe, samples and classes"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df=pd.read_csv('/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train.csv')\ntrain_df.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_sample_counts=train_df.groupby(['class_name','class_id']).size().reset_index().rename(columns={0:'count'})\nclass_sample_counts.sort_values(by='class_id',inplace=True)\nclass_sample_counts.reset_index(drop=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_name=list((class_sample_counts['class_name']))\nprint(f'The total number of classes is {len(class_name)}')\nprint(class_name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(15,5))\nsns.set(font_scale = 1.5)\ng=sns.barplot(x='class_name',y='count',data=class_sample_counts)\ng=g.set_xticklabels(g.get_xticklabels(), rotation=90)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Visualization of bounding box area of each disease class"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_abnormal=train_df[train_df['class_id']!=14].reset_index(drop=True)\ntrain_df_abnormal","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_abnormal['area']=(train_df_abnormal['x_max']-train_df_abnormal['x_min'])*(train_df_abnormal['y_max']-train_df_abnormal['y_min'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_wise_area=train_df_abnormal.groupby(['class_name','class_id'])['area'].mean().reset_index()\nclass_wise_area","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(15,5))\nsns.set(font_scale = 1.5)\ng=sns.barplot(x='class_name',y='area',data=class_wise_area)\ng=g.set_xticklabels(g.get_xticklabels(), rotation=90)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_abnormal.drop('area',axis=1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Histogram"},{"metadata":{"trusted":true},"cell_type":"code","source":"random_num=np.random.randint(low=0,high=len(train_df_abnormal),size=1)\ntrain_df1=train_df_abnormal.iloc[random_num[0]]\ntrain_folder='/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train'\ndicom_image=dicom.dcmread(os.path.join(train_folder,train_df1['image_id'])+'.dicom')  \npixel_data = dicom_image.pixel_array   \npi = dicom_image['PhotometricInterpretation'].value\nif pi == 'MONOCHROME1':\n    pixel_data = np.abs(pixel_data.max()- pixel_data) \nplt.subplots(1,2,figsize=(20,5))\nplt.subplot(1,2,1)\nplt.title('Xray image')\nplt.imshow(pixel_data,'gray')\nplt.subplot(1,2,2)\nplt.title('Histogram of raw image')\nplt.xlabel('Intensity')\nplt.ylabel('Frequency')\ng=plt.hist(pixel_data.ravel(),bins=100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pixel_data_norm=pixel_data.copy()\ncv2.normalize(pixel_data, pixel_data_norm, 0, 255, cv2.NORM_MINMAX)\nplt.subplots(1,2,figsize=(20,5))\nplt.subplot(1,2,1)\nplt.imshow(pixel_data_norm,'gray')\nplt.subplot(1,2,2)\ng=plt.hist(pixel_data_norm.ravel(),bins=50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pixel_data_norm1=np.asarray(pixel_data_norm,np.uint8)\npixel_data_norm1=cv2.equalizeHist(pixel_data_norm1)\nplt.subplots(1,2,figsize=(20,5))\nplt.subplot(1,2,1)\nplt.imshow(pixel_data_norm1,'gray')\nplt.subplot(1,2,2)\nplt.xlabel('Intensity')\nplt.ylabel('Frequency')\ng=plt.hist(pixel_data_norm1.ravel(),bins=30)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Bounding box histogram"},{"metadata":{"trusted":true},"cell_type":"code","source":"x1=int(train_df1['x_min'])\nx2=int(train_df1['x_max'])\ny1=int(train_df1['y_min'])\ny2=int(train_df1['y_max'])\nroi_org=pixel_data[y1:y2,x1:x2]\nroi_normalized=pixel_data_norm[y1:y2,x1:x2]\nroi_equalized=pixel_data_norm1[y1:y2,x1:x2]\nplt.subplots(1,3,figsize=(25,5))\nplt.subplot(1,3,1)\nplt.title('Raw Image')\nplt.xlabel('Intensity')\nplt.ylabel('Frequency')\ng1=plt.hist(roi_org.ravel(),bins=20)\nplt.subplot(1,3,2)\ng2=plt.hist(roi_normalized.ravel(),bins=20)\nplt.title('Normalized Image')\nplt.xlabel('Intensity')\nplt.ylabel('Frequency')\nplt.subplot(1,3,3)\ng3=plt.hist(roi_equalized.ravel(),bins=20)\ng3=plt.title('Equalized Image')\ng3=plt.xlabel('Intensity')\ng3=plt.ylabel('Frequency')\n                          ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Visualization of samples with bounding box"},{"metadata":{"trusted":true},"cell_type":"code","source":"number_of_samples=4\nimages_id=np.random.randint(low=0,high=len(train_df_abnormal),size=number_of_samples)\nncols=min(number_of_samples,4)\nnrows=int(np.ceil(number_of_samples/4))\nplt.subplots(nrows,ncols,figsize=(ncols*5,nrows*5))\nfor i in range(number_of_samples):\n    train_df1=train_df_abnormal.iloc[images_id[i]]\n    train_folder='/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train'\n    dicom_image=dicom.dcmread(os.path.join(train_folder,train_df1['image_id'])+'.dicom')    \n    pixel_data = dicom_image.pixel_array   \n    pi = dicom_image['PhotometricInterpretation'].value\n   # pixel_data = (pixel_data - pixel_data.min())/ (pixel_data.max() - pixel_data.min())\n    if pi == 'MONOCHROME1':\n        pixel_data = np.abs(pixel_data.max()- pixel_data)    \n    cv2.normalize(pixel_data, pixel_data, 0, 255, cv2.NORM_MINMAX)\n    pixel_data=np.asarray(pixel_data,np.uint8)\n    pixel_data=cv2.equalizeHist(pixel_data)\n    pixel_data=cv2.cvtColor(pixel_data,cv2.COLOR_GRAY2RGB)\n    cv2.rectangle(pixel_data,(int(train_df1['x_min']),int(train_df1['y_min'])),((int(train_df1['x_max']),int(train_df1['y_max']))),(0,255,0),20)\n    plt.subplot(nrows,ncols,i+1)\n    plt.imshow(pixel_data)\n    plt.title(train_df1['class_name'])","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}