]> AND Private Git Repository - myo-class.git/blob - topng.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Initialize
[myo-class.git] / topng.py
1 import cv2
2 import os
3 from os.path import isdir, join
4 from os import mkdir
5 import pydicom
6 from pprint import pprint
7 import numpy as np
8 import pathlib
9
10 from decimal import Decimal as d, ROUND_HALF_UP as rhu
11
12 PNG16_MAX = pow(2, 16) - 1 # here if thinks the heaviest weight bit is for transparency or something not in use with dicom imgs
13 PNG8_MAX = pow(2, 8+1) - 1 # heaviest weight bit is 8 => 2**8, but dont forget the others: the reason of +1
14
15 INPUT_DIR = '../../Data/Images_anonymous/Case_0449/'
16 OUT_DIR = './generated/'
17 #os.mkdir(outdir)
18
19 def map16(array):# can be useful in future
20         return array * 16
21
22 # def dround(n):
23 #       return d(str(n)).quantize(d('1'), rounding=rhu)# safe round without
24
25 def affine(Mat, ab, cd):
26         """
27                 Affine transformation
28                 ab: the 'from' interval (2, 384) or {begin:2, end:384} begin is 0, and end is 1
29                 cd: the 'to' interval (0, 1024) {begin:0, end:1024}
30         """
31         a, b = ab[0], ab[1]
32         c, d = cd[0], cd[1]
33         
34         with np.nditer(Mat, op_flags=['readwrite']) as M:
35                 for x in M:
36                         x[...] = max( 0, round( (x-a) * (d-c) / (b-a) + c ) ) # could not be negative
37
38
39 def getdir(filepath):
40         return '/'.join(filepath.split('/')[:-1]) + '/'
41
42 def topng(inputfile, outfile=None, overwrite=True):
43         try:
44                 dicimg = pydicom.read_file(inputfile) # read dicom image
45         except pydicom.errors.InvalidDicomError as e:
46                 # @TODO: log, i can't read this file
47                 return
48         img = dicimg.pixel_array# get image array (12bits)
49
50         # test <<
51         print('img', img)
52         # print('img', type(img))
53         # print('min', img.min(), 'max', img.max())
54         # dicimg.convert_pixel_data() # same as using dicimg.pixel_array
55         # pixa = dicimg._pixel_array
56         # print('dicimg._pixel_array', pixa)
57         # print('dicimg.pixel_array==pixa', dicimg.pixel_array==pixa)
58         # test >>
59
60         # affine transfo to png 16 bits, func affects img variable
61         maxdepth = img.max()
62         # print('maxdepth, PNG8_MAX', maxdepth, PNG8_MAX) # testing..
63         affine(img, 
64                 (img.min(), maxdepth),
65                 (0, PNG16_MAX if maxdepth > PNG8_MAX else PNG8_MAX)
66         )
67         
68         savepath = (outfile or inputfile) + '.png'
69         savedir = getdir(savepath)
70         if overwrite and not isdir( savedir ):
71                 pathlib.Path(savedir).mkdir(parents=True, exist_ok=True)
72
73
74         # test <<
75         # tmp = np.array(img) # to get eye on the numpy format of img
76         # tmp = np.array(img) # to get eye on the numpy format of img
77         # print("img[0,0]", img[0,0])
78         # img[0,0] = 0
79         # tmp.dtype = 'uint32'
80         # np.savetxt(savepath + '.npy', img)
81         # test >>
82
83         cv2.imwrite(savepath, img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) # write png image
84
85
86 def topngs(inputdir, outdir):
87         """
88                 inputdir : directory which contains directly dicom files
89         """
90         files = [f for f in os.listdir(inputdir)]
91
92         for f in files:
93                 topng( inputdir + f, join(outdir, f) )
94
95 if __name__ == '__main__':
96         # topngs( INPUT_DIR, join(OUT_DIR, INPUT_DIR.split('/')[-2]) )
97         topng(INPUT_DIR+'Image00001', OUT_DIR + INPUT_DIR.split('/')[-2] +'-Image00001')