Mercurial > ift6266
comparison transformations/contrast.py @ 27:0b9350998dbe
Added a contrast.py script difining the Contrast transformation class
author | Xavier Glorot <glorotxa@iro.umontreal.ca> |
---|---|
date | Fri, 29 Jan 2010 14:10:10 -0500 |
parents | |
children | 7ef8aac2cdb5 |
comparison
equal
deleted
inserted
replaced
26:47e7202d4f19 | 27:0b9350998dbe |
---|---|
1 #!/usr/bin/python | |
2 # coding: utf-8 | |
3 | |
4 ''' | |
5 Simple implementation of random contrast. This always switch half the time the polarity. | |
6 then it decide of a bias and of a contrast, both of them are dependant of the complexity. | |
7 | |
8 Author: Xavier Glorot | |
9 ''' | |
10 | |
11 import scipy.ndimage.morphology | |
12 import numpy as N | |
13 import copy | |
14 | |
15 | |
16 class Contrast(): | |
17 def __init__(self,complexity = 1): | |
18 #---------- private attributes | |
19 self.__nx__ = 32 #xdim of the images | |
20 self.__ny__ = 32 #ydim of the images | |
21 self.__Pinvert__ = 0.5 #probability to switch polarity | |
22 self.__mincontrast__ = 0.15 | |
23 self.__resolution__ = 256 | |
24 self.__rangecontrastres__ = self.__resolution__ - N.int(self.__mincontrast__*self.__resolution__) | |
25 #------------------------------------------------ | |
26 | |
27 #---------- generation parameters | |
28 self.regenerate_parameters(complexity) | |
29 #------------------------------------------------ | |
30 | |
31 def _get_current_parameters(self): | |
32 return [self.invert,self.contrast] | |
33 | |
34 def get_settings_names(self): | |
35 return ['invert','contrast'] | |
36 | |
37 def regenerate_parameters(self, complexity): | |
38 self.invert = (N.random.uniform() < self.__Pinvert__) | |
39 self.contrast = self.__resolution__ - N.random.randint(1 + self.__rangecontrastres__ * complexity) | |
40 return self._get_current_parameters() | |
41 | |
42 def transform_1_image(self,image): #the real transformation method | |
43 maxi = image.max() | |
44 mini = image.min() | |
45 if self.invert: | |
46 newimage = 1 - (self.__resolution__- self.contrast) / (2 * float(self.__resolution__)) -\ | |
47 (image - mini) / float(maxi - mini) * self.contrast / float(self.__resolution__) | |
48 else: | |
49 newimage = (self.__resolution__- self.contrast) / (2 * float(self.__resolution__)) +\ | |
50 (image - mini) / float(maxi - mini) * self.contrast / float(self.__resolution__) | |
51 if image.dtype == 'uint8': | |
52 return N.asarray(newimage*255,dtype='uint8') | |
53 else: | |
54 return N.asarray(newimage,dtype=image.dtype) | |
55 | |
56 def transform_image(self,image): #handling different format | |
57 if image.shape == (self.__nx__,self.__ny__): | |
58 return self.transform_1_image(image) | |
59 if image.ndim == 3: | |
60 newimage = copy.copy(image) | |
61 for i in range(image.shape[0]): | |
62 newimage[i,:,:] = self.transform_1_image(image[i,:,:]) | |
63 return newimage | |
64 if image.ndim == 2 and image.shape != (self.__nx__,self.__ny__): | |
65 newimage = N.reshape(image,(image.shape[0],self.__nx__,self.__ny__)) | |
66 for i in range(image.shape[0]): | |
67 newimage[i,:,:] = self.transform_1_image(newimage[i,:,:]) | |
68 return N.reshape(newimage,image.shape) | |
69 if image.ndim == 1: | |
70 newimage = N.reshape(image,(self.__nx__,self.__ny__)) | |
71 newimage = self.transform_1_image(newimage) | |
72 return N.reshape(newimage,image.shape) | |
73 assert False #should never go there | |
74 | |
75 | |
76 | |
77 | |
78 #test on NIST (you need pylearn and access to NIST to do that) | |
79 | |
80 if __name__ == '__main__': | |
81 | |
82 from pylearn.io import filetensor as ft | |
83 import copy | |
84 import pygame | |
85 import time | |
86 datapath = '/data/lisa/data/nist/by_class/' | |
87 f = open(datapath+'digits/digits_train_data.ft') | |
88 d = ft.read(f) | |
89 | |
90 pygame.surfarray.use_arraytype('numpy') | |
91 | |
92 pygame.display.init() | |
93 screen = pygame.display.set_mode((8*2*32,8*32),0,8) | |
94 anglcolorpalette=[(x,x,x) for x in xrange(0,256)] | |
95 screen.set_palette(anglcolorpalette) | |
96 | |
97 MyContrast = Contrast() | |
98 | |
99 debut=time.time() | |
100 MyContrast.transform_image(d) | |
101 fin=time.time() | |
102 print '------------------------------------------------' | |
103 print d.shape[0],' images transformed in :', fin-debut, ' seconds' | |
104 print '------------------------------------------------' | |
105 print (fin-debut)/d.shape[0]*1000000,' microseconds per image' | |
106 print '------------------------------------------------' | |
107 print MyContrast.get_settings_names() | |
108 print MyContrast._get_current_parameters() | |
109 print MyContrast.regenerate_parameters(0) | |
110 print MyContrast.regenerate_parameters(0.5) | |
111 print MyContrast.regenerate_parameters(1) | |
112 for i in range(10000): | |
113 a=d[i,:] | |
114 b=N.asarray(N.reshape(a,(32,32))).T | |
115 | |
116 new=pygame.surfarray.make_surface(b) | |
117 new=pygame.transform.scale2x(new) | |
118 new=pygame.transform.scale2x(new) | |
119 new=pygame.transform.scale2x(new) | |
120 new.set_palette(anglcolorpalette) | |
121 screen.blit(new,(0,0)) | |
122 | |
123 print MyContrast.get_settings_names(), MyContrast.regenerate_parameters(1) | |
124 c=MyContrast.transform_image(a) | |
125 b=N.asarray(N.reshape(c,(32,32))).T | |
126 | |
127 new=pygame.surfarray.make_surface(b) | |
128 new=pygame.transform.scale2x(new) | |
129 new=pygame.transform.scale2x(new) | |
130 new=pygame.transform.scale2x(new) | |
131 new.set_palette(anglcolorpalette) | |
132 screen.blit(new,(8*32,0)) | |
133 | |
134 pygame.display.update() | |
135 raw_input('Press Enter') | |
136 | |
137 pygame.display.quit() |