init
This commit is contained in:
BIN
Q1/.DS_Store
vendored
Normal file
BIN
Q1/.DS_Store
vendored
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
97
Q1/code.py
Normal file
97
Q1/code.py
Normal file
@ -0,0 +1,97 @@
|
||||
# code.py
|
||||
# This is an image preprocessing code for HandBoneXRay data, please adopt env.yaml to
|
||||
# create conda env to run this script
|
||||
#
|
||||
# author : deng
|
||||
# date : 20230919
|
||||
# platform: MacBook Pro 14 2021
|
||||
|
||||
import os
|
||||
from shutil import rmtree
|
||||
|
||||
import cv2
|
||||
import pydicom
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
xray_dir = 'HandBoneXRay/'
|
||||
result_dir = 'results'
|
||||
plot = False
|
||||
|
||||
# Create result dir to save processed images
|
||||
if os.path.isdir(result_dir):
|
||||
rmtree(result_dir)
|
||||
os.makedirs(result_dir)
|
||||
|
||||
# Get xray dicom paths
|
||||
dicom_paths = [os.path.join(xray_dir, file_name)
|
||||
for file_name in os.listdir(xray_dir)
|
||||
if file_name.endswith('dcm')]
|
||||
|
||||
for dicom_path in dicom_paths:
|
||||
print(f'Start to process {dicom_path}')
|
||||
|
||||
# Read image
|
||||
ds = pydicom.dcmread(dicom_path)
|
||||
pixel_array = ds.pixel_array
|
||||
orig_pixel_array = pixel_array.copy()
|
||||
if plot:
|
||||
plt.title('Raw image')
|
||||
plt.imshow(pixel_array, cmap='gray')
|
||||
plt.show()
|
||||
|
||||
# Thresholding
|
||||
pixel_array[pixel_array < 1] = 0
|
||||
pixel_array[pixel_array >= 1] = 1
|
||||
pixel_array = pixel_array.astype(np.uint8)
|
||||
if plot:
|
||||
plt.title('Thresholding')
|
||||
plt.imshow(pixel_array, cmap='gray')
|
||||
plt.show()
|
||||
|
||||
# Calculate rotation angle by minAreaRect method
|
||||
contours, _ = cv2.findContours(pixel_array, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||
contour_w_max_area = max(contours, key = cv2.contourArea)
|
||||
rect = cv2.minAreaRect(contour_w_max_area)
|
||||
angle = rect[2]
|
||||
if angle > 45:
|
||||
angle -= 90
|
||||
|
||||
# Rotate image
|
||||
h, w = orig_pixel_array.shape[:2]
|
||||
center = rect[0]
|
||||
matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
|
||||
rotated = cv2.warpAffine(orig_pixel_array, matrix, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT)
|
||||
if plot:
|
||||
plt.title('Rotated image')
|
||||
plt.imshow(rotated, cmap='gray')
|
||||
plt.show()
|
||||
|
||||
# Crop edge
|
||||
xs, ys = np.nonzero(rotated)
|
||||
x_min,x_max = xs.min(), xs.max()
|
||||
y_min, y_max = ys.min(), ys.max()
|
||||
cropped = rotated[x_min:x_max+1, y_min:y_max+1]
|
||||
cropped = cropped.astype(np.uint16)
|
||||
if plot:
|
||||
plt.title('Cropped image')
|
||||
plt.imshow(cropped, cmap='gray')
|
||||
plt.show()
|
||||
|
||||
# Save it
|
||||
save_path = os.path.join(result_dir, os.path.basename(dicom_path))
|
||||
ds.PixelData = cropped
|
||||
ds.Rows = cropped.shape[0]
|
||||
ds.Columns = cropped.shape[1]
|
||||
pydicom.filewriter.dcmwrite(save_path, ds)
|
||||
if plot:
|
||||
ds = pydicom.dcmread(save_path)
|
||||
pixel_array = ds.pixel_array
|
||||
plt.title('Saved image')
|
||||
plt.imshow(pixel_array, cmap='gray')
|
||||
plt.show()
|
||||
|
||||
print('done.')
|
134
Q1/env.yaml
Normal file
134
Q1/env.yaml
Normal file
@ -0,0 +1,134 @@
|
||||
name: Q1
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- aom=3.5.0
|
||||
- brotli=1.1.0
|
||||
- brotli-bin=1.1.0
|
||||
- bzip2=1.0.8
|
||||
- c-ares=1.19.1
|
||||
- ca-certificates=2023.7.22
|
||||
- cairo=1.16.0
|
||||
- certifi=2023.7.22
|
||||
- contourpy=1.1.1
|
||||
- cycler=0.11.0
|
||||
- dav1d=1.2.1
|
||||
- expat=2.5.0
|
||||
- ffmpeg=6.0.0
|
||||
- font-ttf-dejavu-sans-mono=2.37
|
||||
- font-ttf-inconsolata=3.000
|
||||
- font-ttf-source-code-pro=2.038
|
||||
- font-ttf-ubuntu=0.83
|
||||
- fontconfig=2.14.2
|
||||
- fonts-conda-ecosystem=1
|
||||
- fonts-conda-forge=1
|
||||
- fonttools=4.42.1
|
||||
- freetype=2.12.1
|
||||
- fribidi=1.0.10
|
||||
- gettext=0.21.1
|
||||
- gmp=6.2.1
|
||||
- gnutls=3.7.8
|
||||
- graphite2=1.3.13
|
||||
- harfbuzz=8.2.0
|
||||
- hdf5=1.14.2
|
||||
- icu=73.2
|
||||
- jasper=4.0.0
|
||||
- kiwisolver=1.4.5
|
||||
- krb5=1.21.2
|
||||
- lame=3.100
|
||||
- lcms2=2.15
|
||||
- lerc=4.0.0
|
||||
- libabseil=20230802.1
|
||||
- libaec=1.0.6
|
||||
- libass=0.17.1
|
||||
- libblas=3.9.0
|
||||
- libbrotlicommon=1.1.0
|
||||
- libbrotlidec=1.1.0
|
||||
- libbrotlienc=1.1.0
|
||||
- libcblas=3.9.0
|
||||
- libcurl=8.3.0
|
||||
- libcxx=16.0.6
|
||||
- libdeflate=1.19
|
||||
- libedit=3.1.20191231
|
||||
- libev=4.33
|
||||
- libexpat=2.5.0
|
||||
- libffi=3.4.2
|
||||
- libgfortran=5.0.0
|
||||
- libgfortran5=13.2.0
|
||||
- libglib=2.78.0
|
||||
- libiconv=1.17
|
||||
- libidn2=2.3.4
|
||||
- libjpeg-turbo=2.1.5.1
|
||||
- liblapack=3.9.0
|
||||
- liblapacke=3.9.0
|
||||
- libnghttp2=1.52.0
|
||||
- libopenblas=0.3.24
|
||||
- libopencv=4.8.0
|
||||
- libopenvino=2023.0.2
|
||||
- libopenvino-arm-cpu-plugin=2023.0.2
|
||||
- libopenvino-auto-batch-plugin=2023.0.2
|
||||
- libopenvino-auto-plugin=2023.0.2
|
||||
- libopenvino-hetero-plugin=2023.0.2
|
||||
- libopenvino-ir-frontend=2023.0.2
|
||||
- libopenvino-onnx-frontend=2023.0.2
|
||||
- libopenvino-paddle-frontend=2023.0.2
|
||||
- libopenvino-pytorch-frontend=2023.0.2
|
||||
- libopenvino-tensorflow-frontend=2023.0.2
|
||||
- libopenvino-tensorflow-lite-frontend=2023.0.2
|
||||
- libopus=1.3.1
|
||||
- libpng=1.6.39
|
||||
- libprotobuf=4.23.4
|
||||
- libsqlite=3.43.0
|
||||
- libssh2=1.11.0
|
||||
- libtasn1=4.19.0
|
||||
- libtiff=4.6.0
|
||||
- libunistring=0.9.10
|
||||
- libvpx=1.13.0
|
||||
- libwebp-base=1.3.2
|
||||
- libxcb=1.15
|
||||
- libxml2=2.11.5
|
||||
- libzlib=1.2.13
|
||||
- llvm-openmp=16.0.6
|
||||
- matplotlib=3.8.0
|
||||
- matplotlib-base=3.8.0
|
||||
- munkres=1.1.4
|
||||
- ncurses=6.4
|
||||
- nettle=3.8.1
|
||||
- numpy=1.26.0
|
||||
- opencv=4.8.0
|
||||
- openh264=2.3.1
|
||||
- openjpeg=2.5.0
|
||||
- openssl=3.1.2
|
||||
- p11-kit=0.24.1
|
||||
- packaging=23.1
|
||||
- pcre2=10.40
|
||||
- pillow=10.0.1
|
||||
- pip=23.2.1
|
||||
- pixman=0.40.0
|
||||
- pthread-stubs=0.4
|
||||
- pugixml=1.13
|
||||
- py-opencv=4.8.0
|
||||
- pydicom=2.4.3
|
||||
- pyparsing=3.1.1
|
||||
- python=3.10.12
|
||||
- python-dateutil=2.8.2
|
||||
- python_abi=3.10
|
||||
- readline=8.2
|
||||
- setuptools=68.2.2
|
||||
- six=1.16.0
|
||||
- snappy=1.1.10
|
||||
- svt-av1=1.7.0
|
||||
- tbb=2021.10.0
|
||||
- tk=8.6.12
|
||||
- tornado=6.3.3
|
||||
- tzdata=2023c
|
||||
- unicodedata2=15.0.0
|
||||
- wheel=0.41.2
|
||||
- x264=1!164.3095
|
||||
- x265=3.5
|
||||
- xorg-libxau=1.0.11
|
||||
- xorg-libxdmcp=1.1.3
|
||||
- xz=5.2.6
|
||||
- zlib=1.2.13
|
||||
- zstd=1.5.5
|
||||
prefix: /Users/xiao_deng/miniforge3/envs/Q1
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user