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

Private GIT Repository
c9b72d963fb31594be3d1a350daf771c956c4873
[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         """
44                 return (64, 64) : the width and height
45         """
46         try:
47                 dicimg = pydicom.read_file(inputfile) # read dicom image
48         except pydicom.errors.InvalidDicomError as e:
49                 # @TODO: log, i can't read this file
50                 return
51         img = dicimg.pixel_array# get image array (12bits)
52
53         # test <<
54         # return img.shape # $$ COMMENT OR REMOVE THIS LINE 
55         print('img', img)
56         # print('img', type(img))
57         # print('min', img.min(), 'max', img.max())
58         # dicimg.convert_pixel_data() # same as using dicimg.pixel_array
59         # pixa = dicimg._pixel_array
60         # print('dicimg._pixel_array', pixa)
61         # print('dicimg.pixel_array==pixa', dicimg.pixel_array==pixa)
62         # test >>
63
64         # affine transfo to png 16 bits, func affects img variable
65         maxdepth = img.max()
66         # print('maxdepth, PNG8_MAX', maxdepth, PNG8_MAX) # testing..
67         affine(img, 
68                 (img.min(), maxdepth),
69                 (0, PNG16_MAX if maxdepth > PNG8_MAX else PNG8_MAX)
70         )
71         
72         savepath = (outfile or inputfile) + '.png'
73         savedir = getdir(savepath)
74         if overwrite and not isdir( savedir ):
75                 pathlib.Path(savedir).mkdir(parents=True, exist_ok=True)
76
77
78         # test <<
79         # tmp = np.array(img) # to get eye on the numpy format of img
80         # tmp = np.array(img) # to get eye on the numpy format of img
81         # print("img[0,0]", img[0,0])
82         # img[0,0] = 0
83         # tmp.dtype = 'uint32'
84         # np.savetxt(savepath + '.npy', img)
85         # test >>
86
87         cv2.imwrite(savepath, img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) # write png image
88
89         # test
90         return img.shape
91
92 def topngs(inputdir, outdir):
93         """
94                 inputdir : directory which contains directly dicom files
95         """
96         files = [f for f in os.listdir(inputdir)]
97
98         for f in files:
99                 topng( inputdir + f, join(outdir, f) )
100
101 if __name__ == '__main__':
102         # topngs( INPUT_DIR, join(OUT_DIR, INPUT_DIR.split('/')[-2]) )
103         topng(INPUT_DIR+'Image00001', OUT_DIR + INPUT_DIR.split('/')[-2] +'-Image00001')