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 | ''' |