Statistiques
| Révision :

root / bin / normalise.py @ 21

Historique | Voir | Annoter | Télécharger (2,88 ko)

1 21 akiss
#!/usr/bin/env python
2 21 akiss
3 21 akiss
# before lounching the executable activate the timagetk conda environement
4 21 akiss
# conda activate florivar
5 21 akiss
6 21 akiss
# general imports :
7 21 akiss
from sys import path, argv
8 21 akiss
import os
9 21 akiss
import time
10 21 akiss
import numpy as np
11 21 akiss
from skimage.filters import threshold_otsu
12 21 akiss
13 21 akiss
from titk_tools.io import imread, imsave, SpatialImage
14 21 akiss
#from timagetk.plugins import linear_filtering
15 21 akiss
from scipy.ndimage import gaussian_filter
16 21 akiss
17 21 akiss
# multiprocessing
18 21 akiss
from multiprocessing import Pool
19 21 akiss
nproc = 20 # number of processors
20 21 akiss
21 21 akiss
print('=======================================')
22 21 akiss
23 21 akiss
def gauss_titk(img, radius):
24 21 akiss
        '''
25 21 akiss
        gaussian filter with radius in real units
26 21 akiss
        - if radius=a number : isotropic
27 21 akiss
        - if radius= a list of numbers : anisotropic
28 21 akiss
        '''
29 21 akiss
        img_filtered = linear_filtering(img, std_dev=radius, method='gaussian_smoothing')#, real=True)
30 21 akiss
        return img_filtered
31 21 akiss
32 21 akiss
33 21 akiss
def gauss_nd(img, radius):
34 21 akiss
        '''
35 21 akiss
        gaussian filter with radius in real units
36 21 akiss
        - if radius=a number : isotropic
37 21 akiss
        - if radius= a list of numbers : anisotropic
38 21 akiss
        '''
39 21 akiss
        img_filtered = gaussian_filter(img, radius)
40 21 akiss
        return img_filtered
41 21 akiss
42 21 akiss
def iterated_gauss_2d(img):
43 21 akiss
        vs=img.voxelsize
44 21 akiss
        rad=2*vs[2]/vs[0]
45 21 akiss
        #rad=10
46 21 akiss
        radius = [rad, rad, 0]
47 21 akiss
        img_filtered=gaussian_filter(img, radius)
48 21 akiss
        rad=rad/2
49 21 akiss
        while rad>1:
50 21 akiss
                print(rad)
51 21 akiss
                radius=[rad,rad,0]
52 21 akiss
                img_filtered = gaussian_filter(img_filtered, radius)
53 21 akiss
                rad=rad/2
54 21 akiss
        return SpatialImage(img_filtered, dtype='uint8', voxelsize=vs, origin=[0, 0, 0])
55 21 akiss
56 21 akiss
57 21 akiss
indir = argv[1]
58 21 akiss
T = int(argv[2])
59 21 akiss
60 21 akiss
newdir=indir+'_normalised-OtsuT'+str(T)
61 21 akiss
os.system("mkdir -p "+newdir)
62 21 akiss
63 21 akiss
print('Normalising images in the folder:',indir)
64 21 akiss
print('Common Otsu threshold for normalisation:',T)
65 21 akiss
print('Results will be written in the folder:',newdir)
66 21 akiss
67 21 akiss
pathdir=indir
68 21 akiss
listfiles=os.listdir(pathdir)
69 21 akiss
70 21 akiss
def treat_file(i):
71 21 akiss
        filename = listfiles[i]
72 21 akiss
        extension = filename.split('.')[-1]
73 21 akiss
        if extension=='tif':
74 21 akiss
                print('--------------------------')
75 21 akiss
                print(filename)
76 21 akiss
                im = imread(pathdir+'/'+filename)
77 21 akiss
                # filter for computing Otsu
78 21 akiss
                #imf = iterated_gauss_2d(im)
79 21 akiss
                imf=im
80 21 akiss
                if len(np.unique(imf))>0:#20:
81 21 akiss
                        iotsu = threshold_otsu(imf)
82 21 akiss
                        # normalise the original image
83 21 akiss
                        imin = np.min(im)+0.0
84 21 akiss
                        imax= np.max(im)+0.0
85 21 akiss
                        a = T/(iotsu-imin)
86 21 akiss
                        b = - imin*a
87 21 akiss
                        transformed_im = SpatialImage(a*im+b, dtype='uint16', voxelsize=im.voxelsize, origin=[0, 0, 0])
88 21 akiss
                        transformed_im[transformed_im>255]=255
89 21 akiss
                        transformed_im = SpatialImage(transformed_im, dtype='uint8', voxelsize=im.voxelsize, origin=[0, 0, 0])
90 21 akiss
                        tiotsu = threshold_otsu(transformed_im)
91 21 akiss
                        imf = iterated_gauss_2d(transformed_im)
92 21 akiss
                        tiotsuf = threshold_otsu(imf)
93 21 akiss
                        print('   otsu=',iotsu,'  otsu normalised=',tiotsu,'  otsu normalised filtered=',tiotsuf)
94 21 akiss
                        newname = 'norm'+str(T)+'-'+filename
95 21 akiss
                        newnamef = 'filtered-'+newname
96 21 akiss
                        #imsave(newdir+'/'+newname,transformed_im)
97 21 akiss
                        imsave(newdir+'/'+newnamef,imf)
98 21 akiss
        return 0
99 21 akiss
100 21 akiss
101 21 akiss
inputs = range(len(listfiles))
102 21 akiss
103 21 akiss
104 21 akiss
for i in range(len(inputs)):
105 21 akiss
        treat_file(i)
106 21 akiss
107 21 akiss
108 21 akiss
'''
109 21 akiss
pool = Pool(processes=nproc)
110 21 akiss
pool.map(treat_file, inputs)
111 21 akiss
pool.close()
112 21 akiss
pool.join()
113 21 akiss
'''