Morph-M Python - Python Active Windows » History » Version 4
Jean Felder, 03/16/2010 06:30 PM
| 1 | 1 | Serge Koudoro | h1. Morph-M Python - Python Active Windows |
|---|---|---|---|
| 2 | |||
| 3 | h2{color:#8B0000;background:#ddd}. Introduction |
||
| 4 | |||
| 5 | *What Active windows does ?* |
||
| 6 | |||
| 7 | Sometimes, you do not need to work on the whole image. Active window is here to help you ! Define 1,2,3 or more active window on your image, then get all these pixel and work with them. |
||
| 8 | |||
| 9 | 2 | Serge Koudoro | Example images are better than words, so try all example. |
| 10 | 1 | Serge Koudoro | |
| 11 | 2 | Serge Koudoro | h2{color:#8B0000;background:#ddd}. Example: Construct 3D volume with image stack |
| 12 | 1 | Serge Koudoro | |
| 13 | 2 | Serge Koudoro | h2{color:#8B0000;background:#ddd}. Example : Build 1 image with some part of 2 different images |
| 14 | |||
| 15 | 1 | Serge Koudoro | | !{width:400px}http://morphm.ensmp.fr/attachments/84/active_windows_1.PNG! |<pre><code class="ruby"> |
| 16 | import morphee as mp |
||
| 17 | |||
| 18 | def combineImage(ImIn1,ImIn2): |
||
| 19 | #we activate the same window on each image (Red windows) |
||
| 20 | ImIn1.setActiveWindow(201,14,1,30,30,1) |
||
| 21 | ImIn2.setActiveWindow(201,14,1,30,30,1) |
||
| 22 | |||
| 23 | #copy only active window |
||
| 24 | mp.ImCopy(ImIn1,ImIn2) |
||
| 25 | |||
| 26 | # remove active window so all image is actived |
||
| 27 | ImIn1.resetActiveWindow() |
||
| 28 | ImIn2.resetActiveWindow() |
||
| 29 | |||
| 30 | #Now, we activate the same window on each image(Blue windows) |
||
| 31 | ImIn1.setActiveWindow(45,73,0,50,40,1) |
||
| 32 | ImIn2.setActiveWindow(45,73,0,50,40,1) |
||
| 33 | |||
| 34 | #copy only active window |
||
| 35 | mp.ImCopy(ImIn1,ImIn2) |
||
| 36 | |||
| 37 | #remove active window so all image is actived |
||
| 38 | ImIn1.resetActiveWindow() |
||
| 39 | ImIn2.resetActiveWindow() |
||
| 40 | |||
| 41 | return ImIn2 |
||
| 42 | |||
| 43 | if __name__=='__main__': |
||
| 44 | #Read im1 and im2. |
||
| 45 | im1=mp.fileRead(images_dir+ "\\Gray\\tools.png") |
||
| 46 | im2=mp.fileRead(images_dir+ "\\Gray\\tw.png") |
||
| 47 | |||
| 48 | final_image = combineImage(im1,im2) |
||
| 49 | |||
| 50 | #write result |
||
| 51 | mp.fileWrite(final_image,"D:\\final_image.png") |
||
| 52 | </code></pre>| |
||
| 53 | |||
| 54 | 2 | Serge Koudoro | h2{color:#8B0000;background:#ddd}. Example : Mathematical Morphology operation on Active window |
| 55 | 1 | Serge Koudoro | |
| 56 | | !{width:400px}http://morphm.ensmp.fr/attachments/85/active_windows_2.PNG! |<pre><code class="ruby"> |
||
| 57 | import morphee as mp |
||
| 58 | |||
| 59 | def ErodeImagePart(im): |
||
| 60 | imEro = mp.getSame(im) |
||
| 61 | |||
| 62 | #create structuring element |
||
| 63 | nl = mp.NeighborList.neighborsSquare2D |
||
| 64 | |||
| 65 | #we activate the same window on each image (Red box) |
||
| 66 | im.setActiveWindow(1,1,1,66,66,1) |
||
| 67 | imEro.setActiveWindow(1,1,1,66,66,1) |
||
| 68 | |||
| 69 | #Erode active window |
||
| 70 | mp.ImErode( im, mp.HomotheticSE(nl,10), imEro) |
||
| 71 | |||
| 72 | # remove active window so all image is actived |
||
| 73 | im.resetActiveWindow() |
||
| 74 | imEro.resetActiveWindow() |
||
| 75 | |||
| 76 | return imEro |
||
| 77 | |||
| 78 | if __name__=='__main__': |
||
| 79 | #Read image |
||
| 80 | im=mp.fileRead(images_dir+ "\\Bin\\balls.png") |
||
| 81 | |||
| 82 | final_image = ErodeImagePart(im) |
||
| 83 | |||
| 84 | #write result |
||
| 85 | mp.fileWrite(final_image,"D:\\final_image.png") |
||
| 86 | </code></pre>| |
||
| 87 | |||
| 88 | 2 | Serge Koudoro | h2{color:#8B0000;background:#ddd}. Example : Set image Boundary with Active window |
| 89 | 1 | Serge Koudoro | |
| 90 | | !{width:400px}http://morphm.ensmp.fr/attachments/86/active_windows_3.png! |<pre><code class="ruby"> |
||
| 91 | import morphee as mp |
||
| 92 | |||
| 93 | def set_boundary(im, depth, value = 255): |
||
| 94 | |||
| 95 | for i in [(0,0,0),(im.wxSize-depth, 0, 0)]: |
||
| 96 | im.setActiveWindow(i[0], i[1], i[2], depth, |
||
| 97 | im.wySize,im.wzSize) |
||
| 98 | mp.ImSetConstant(im, value) |
||
| 99 | im.resetActiveWindow() |
||
| 100 | for i in [(0, 0, 0),(0, im.wySize-depth, 0)]: |
||
| 101 | im.setActiveWindow(i[0], i[1], i[2], im.wxSize, |
||
| 102 | depth,im.wzSize) |
||
| 103 | mp.ImSetConstant(im, value) |
||
| 104 | im.resetActiveWindow() |
||
| 105 | if im.getZSize() == 3: |
||
| 106 | for i in [(0, 0, 0),(0, 0, im3d.wzSize-depth)]: |
||
| 107 | im.setActiveWindow(i[0], i[1], i[2], im.wxSize, |
||
| 108 | im.wySize,depth) |
||
| 109 | mp.ImSetConstant(im, value) |
||
| 110 | im.resetActiveWindow() |
||
| 111 | return im |
||
| 112 | |||
| 113 | if __name__=='__main__': |
||
| 114 | #Read image |
||
| 115 | im=mp.fileRead(images_dir+ "\\Gray\\tw.png") |
||
| 116 | |||
| 117 | final_image = set_boundary(im, 50, 0): |
||
| 118 | |||
| 119 | #write result |
||
| 120 | mp.fileWrite(final_image,"D:\\final_image.png") |
||
| 121 | </code></pre>| |
||
| 122 | 3 | Jean Felder | |
| 123 | h2{color:#8B0000;background:#ddd}. Of active window, coordinates and offsets |
||
| 124 | |||
| 125 | We have already seen how to create and use an Active Window. |
||
| 126 | However, we can notice that an active Window defines a new system of coordinates. |
||
| 127 | That's why, it could be interesting to use offsets and Coordinates in this new system. |
||
| 128 | Two operations can be defined: |
||
| 129 | * coordinates to offset transformation |
||
| 130 | * offset to coordinates transformation |
||
| 131 | |||
| 132 | h3{color:black}. +coordinates to offset+ |
||
| 133 | |||
| 134 | Let's consider the following example: |
||
| 135 | |||
| 136 | <pre><code class="ruby"> |
||
| 137 | import morphee as mp |
||
| 138 | |||
| 139 | # I create a new image, size: 200x200x1 |
||
| 140 | imIn = mp.createImage(mp.dataCategory.dtScalar, mp.scalarDataType.sdtUINT8) |
||
| 141 | imIn.setSize(200, 200) |
||
| 142 | imIn.allocateImage() |
||
| 143 | |||
| 144 | # Let's get an offset from a pixel inside the image: |
||
| 145 | print "offset at (50, 23):", mp.GetOffsetFromCoords( imIn, (50, 23, 0) ) |
||
| 146 | |||
| 147 | # Let's define an active Window now ! |
||
| 148 | # It begins at (50, 20, 0), length : (10, 10, 1) |
||
| 149 | imIn.setActiveWindow(50, 20, 0, 10, 10, 1) |
||
| 150 | |||
| 151 | # Let's get an offset inside the active Window |
||
| 152 | print "Active Window, offset at (0, 3):", mp.GetOffsetFromWindowCoords( imIn, (0, 3, 0) ) |
||
| 153 | </code></pre> |
||
| 154 | |||
| 155 | If we try to launch the previous example, we'll get as expected : |
||
| 156 | <pre> |
||
| 157 | offset at (50, 23): 4650 |
||
| 158 | Active Window, offset at (0, 3): 4650 |
||
| 159 | </pre> |
||
| 160 | |||
| 161 | From the previous example, we can notice that an offset is a global measure ! It means that your offset doesn't change when an active window is set. |
||
| 162 | You just need to remember that your coordinates change with an active Window but not your offset |
||
| 163 | |||
| 164 | h3{color:black}. +offset to coordinates+ |
||
| 165 | |||
| 166 | 4 | Jean Felder | We can now define the inverse function wich transforms an active window into coords. |
| 167 | 3 | Jean Felder | The following code is quite simple: |
| 168 | |||
| 169 | <pre><code class="ruby"> |
||
| 170 | import morphee as mp |
||
| 171 | |||
| 172 | # I create a new image, size: 200x200x1 |
||
| 173 | imIn = mp.createImage(mp.dataCategory.dtScalar, mp.scalarDataType.sdtUINT8) |
||
| 174 | imIn.setSize(200, 200) |
||
| 175 | imIn.allocateImage() |
||
| 176 | |||
| 177 | # Let's get coords from an offset inside the image: |
||
| 178 | print "coords without active window:", mp.GetCoordsFromOffset( imIn, 4258 ) |
||
| 179 | |||
| 180 | # Let's define an active Window now ! |
||
| 181 | # It begins at (50, 20, 0), length : (10, 10, 1) |
||
| 182 | imIn.setActiveWindow(50, 20, 0, 10, 10, 1) |
||
| 183 | |||
| 184 | # Let's get coords inside the active Window |
||
| 185 | print "coords with active window:", mp.GetRelativeCoordsFromOffset( imIn, 4258 ) |
||
| 186 | </code></pre> |
||
| 187 | |||
| 188 | It will produce the following output: |
||
| 189 | |||
| 190 | <pre> |
||
| 191 | coords without active window: (58, 21, 0) |
||
| 192 | coords with active window: (8, 1, 0) |
||
| 193 | </pre> |
||
| 194 | |||
| 195 | Unlike the first operation (coordinates to offset transformation), the offset to coordinates operation will check if |
||
| 196 | your offset is inside the image. As far as active window are concerned, it means that if you have set an active window, |
||
| 197 | you can't get coords out of your active window. |
||
| 198 | For example, this code will return an error: |
||
| 199 | |||
| 200 | <pre><code class="ruby"> |
||
| 201 | import morphee as mp |
||
| 202 | |||
| 203 | # I create a new image, size: 200x200x1 |
||
| 204 | imIn = mp.createImage(mp.dataCategory.dtScalar, mp.scalarDataType.sdtUINT8) |
||
| 205 | imIn.setSize(200, 200) |
||
| 206 | imIn.allocateImage() |
||
| 207 | |||
| 208 | # Let's get coords from a pixel inside the image: |
||
| 209 | # 4258 = 21 * 200 + 58 -> (58, 21, 0) |
||
| 210 | print "coords without active window:", mp.GetCoordsFromOffset( imIn, 4258 ) |
||
| 211 | |||
| 212 | # Let's define an active Window now ! |
||
| 213 | # It begins at (50, 10, 0), length : (10, 10, 1) |
||
| 214 | imIn.setActiveWindow(50, 10, 0, 10, 10, 1) |
||
| 215 | |||
| 216 | 1 | Serge Koudoro | # Let's get try to get coords outside of the active Window, |
| 217 | 4 | Jean Felder | # (58, 21, 0) is out of the active window |
| 218 | 3 | Jean Felder | # it will return an error ! |
| 219 | print "coords with active window, error:", mp.GetRelativeCoordsFromOffset( imIn, 4258 ) |
||
| 220 | </code></pre> |
||
| 221 | |||
| 222 | The error: |
||
| 223 | |||
| 224 | <pre> |
||
| 225 | coords without active window: (58, 21, 0) |
||
| 226 | coords with active window, error: |
||
| 227 | Traceback (most recent call last): |
||
| 228 | File "./test.py", line 19, in <module> |
||
| 229 | print "coords with active window, error:", mp.GetRelativeCoordsFromOffset( imIn, 4258 ) |
||
| 230 | RuntimeError: t_GetRelativeCoordsFromOffset : result outside the window |
||
| 231 | |||
| 232 | -- Morphee backtrace: |
||
| 233 | </pre> |