OSDN Git Service

67e657f1c6e9c51f08663832b49ee7fd37423d5d
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / rasterfilter / rgb2bin / NyARRasterFilter_ARToolkitThreshold.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java edition ARToolKit class library.\r
11  * Copyright (C)2008-2009 Ryo Iizuka\r
12  *\r
13  * This program is free software; you can redistribute it and/or\r
14  * modify it under the terms of the GNU Lesser General Public License\r
15  * as published by the Free Software Foundation; either version 3\r
16  * of the License, or (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
21  * GNU Lesser General Public License for more details\r
22  * \r
23  * You should have received a copy of the GNU Lesser General Public\r
24  * License along with this program. If not, see <http://www.gnu.org/licenses/>.\r
25  * \r
26  * For further information please contact.\r
27  *      http://nyatla.jp/nyatoolkit/\r
28  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
29  * \r
30  */\r
31 package jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin;\r
32 \r
33 import jp.nyatla.nyartoolkit.NyARException;\r
34 import jp.nyatla.nyartoolkit.core.raster.*;\r
35 import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;\r
36 import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
37 import jp.nyatla.nyartoolkit.core.types.*;\r
38 \r
39 /**\r
40  * 定数閾値による2値化をする。\r
41  * \r
42  */\r
43 public class NyARRasterFilter_ARToolkitThreshold implements INyARRasterFilter_RgbToBin\r
44 {\r
45         interface IdoThFilterImpl\r
46         {\r
47                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold);\r
48         }\r
49         class doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24 implements IdoThFilterImpl\r
50         {\r
51                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
52                 {\r
53                         int[] out_buf = (int[]) i_output.getBuffer();\r
54                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
55                         \r
56                         final int th=i_threshold*3;\r
57                         int bp =(i_size.w*i_size.h-1)*3;\r
58                         int w;\r
59                         int xy;\r
60                         final int pix_count   =i_size.h*i_size.w;\r
61                         final int pix_mod_part=pix_count-(pix_count%8);\r
62                         for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
63                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
64                                 out_buf[xy]=w<=th?0:1;\r
65                                 bp -= 3;\r
66                         }\r
67                         //タイリング\r
68                         for (;xy>=0;) {\r
69                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
70                                 out_buf[xy]=w<=th?0:1;\r
71                                 bp -= 3;\r
72                                 xy--;\r
73                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
74                                 out_buf[xy]=w<=th?0:1;\r
75                                 bp -= 3;\r
76                                 xy--;\r
77                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
78                                 out_buf[xy]=w<=th?0:1;\r
79                                 bp -= 3;\r
80                                 xy--;\r
81                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
82                                 out_buf[xy]=w<=th?0:1;\r
83                                 bp -= 3;\r
84                                 xy--;\r
85                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
86                                 out_buf[xy]=w<=th?0:1;\r
87                                 bp -= 3;\r
88                                 xy--;\r
89                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
90                                 out_buf[xy]=w<=th?0:1;\r
91                                 bp -= 3;\r
92                                 xy--;\r
93                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
94                                 out_buf[xy]=w<=th?0:1;\r
95                                 bp -= 3;\r
96                                 xy--;\r
97                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
98                                 out_buf[xy]=w<=th?0:1;\r
99                                 bp -= 3;\r
100                                 xy--;\r
101                         }\r
102                         return;                 \r
103                 }\r
104                 \r
105         }\r
106         class doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32 implements IdoThFilterImpl\r
107         {\r
108                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
109                 {\r
110                         int[] out_buf = (int[]) i_output.getBuffer();\r
111                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
112                         \r
113                         final int th=i_threshold*3;\r
114                         int bp =(i_size.w*i_size.h-1)*4;\r
115                         int w;\r
116                         int xy;\r
117                         final int pix_count   =i_size.h*i_size.w;\r
118                         final int pix_mod_part=pix_count-(pix_count%8);\r
119                         for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
120                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
121                                 out_buf[xy]=w<=th?0:1;\r
122                                 bp -= 4;\r
123                         }\r
124                         //タイリング\r
125                         for (;xy>=0;) {\r
126                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
127                                 out_buf[xy]=w<=th?0:1;\r
128                                 bp -= 4;\r
129                                 xy--;\r
130                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
131                                 out_buf[xy]=w<=th?0:1;\r
132                                 bp -= 4;\r
133                                 xy--;\r
134                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
135                                 out_buf[xy]=w<=th?0:1;\r
136                                 bp -= 4;\r
137                                 xy--;\r
138                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
139                                 out_buf[xy]=w<=th?0:1;\r
140                                 bp -= 4;\r
141                                 xy--;\r
142                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
143                                 out_buf[xy]=w<=th?0:1;\r
144                                 bp -= 4;\r
145                                 xy--;\r
146                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
147                                 out_buf[xy]=w<=th?0:1;\r
148                                 bp -= 4;\r
149                                 xy--;\r
150                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
151                                 out_buf[xy]=w<=th?0:1;\r
152                                 bp -= 4;\r
153                                 xy--;\r
154                                 w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
155                                 out_buf[xy]=w<=th?0:1;\r
156                                 bp -= 4;\r
157                                 xy--;\r
158                         }                       \r
159                 }               \r
160         }\r
161         \r
162         class doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32 implements IdoThFilterImpl\r
163         {\r
164                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
165                 {\r
166                         int[] out_buf = (int[]) i_output.getBuffer();\r
167                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
168                         \r
169                         final int th=i_threshold*3;\r
170                         int bp =(i_size.w*i_size.h-1)*4;\r
171                         int w;\r
172                         int xy;\r
173                         final int pix_count   =i_size.h*i_size.w;\r
174                         final int pix_mod_part=pix_count-(pix_count%8);\r
175                         for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
176                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
177                                 out_buf[xy]=w<=th?0:1;\r
178                                 bp -= 4;\r
179                         }\r
180                         //タイリング\r
181                         for (;xy>=0;) {\r
182                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
183                                 out_buf[xy]=w<=th?0:1;\r
184                                 bp -= 4;\r
185                                 xy--;\r
186                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
187                                 out_buf[xy]=w<=th?0:1;\r
188                                 bp -= 4;\r
189                                 xy--;\r
190                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
191                                 out_buf[xy]=w<=th?0:1;\r
192                                 bp -= 4;\r
193                                 xy--;\r
194                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
195                                 out_buf[xy]=w<=th?0:1;\r
196                                 bp -= 4;\r
197                                 xy--;\r
198                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
199                                 out_buf[xy]=w<=th?0:1;\r
200                                 bp -= 4;\r
201                                 xy--;\r
202                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
203                                 out_buf[xy]=w<=th?0:1;\r
204                                 bp -= 4;\r
205                                 xy--;\r
206                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
207                                 out_buf[xy]=w<=th?0:1;\r
208                                 bp -= 4;\r
209                                 xy--;\r
210                                 w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
211                                 out_buf[xy]=w<=th?0:1;\r
212                                 bp -= 4;\r
213                                 xy--;\r
214                         }\r
215                         return;                 \r
216                 }\r
217                 \r
218         }       \r
219         \r
220         class doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32 implements IdoThFilterImpl\r
221         {\r
222                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
223                 {\r
224                         int[] out_buf = (int[]) i_output.getBuffer();\r
225                         int[] in_buf = (int[]) i_input.getBuffer();\r
226                         \r
227                         final int th=i_threshold*3;\r
228                         int w;\r
229                         int xy;\r
230                         final int pix_count   =i_size.h*i_size.w;\r
231                         final int pix_mod_part=pix_count-(pix_count%8);\r
232 \r
233                         for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
234                                 w=in_buf[xy];\r
235                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
236                         }\r
237                         //タイリング\r
238                         for (;xy>=0;) {\r
239                                 w=in_buf[xy];\r
240                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
241                                 xy--;\r
242                                 w=in_buf[xy];\r
243                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
244                                 xy--;\r
245                                 w=in_buf[xy];\r
246                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
247                                 xy--;\r
248                                 w=in_buf[xy];\r
249                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
250                                 xy--;\r
251                                 w=in_buf[xy];\r
252                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
253                                 xy--;\r
254                                 w=in_buf[xy];\r
255                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
256                                 xy--;\r
257                                 w=in_buf[xy];\r
258                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
259                                 xy--;\r
260                                 w=in_buf[xy];\r
261                                 out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
262                                 xy--;\r
263                         }                       \r
264                 }               \r
265         }\r
266         \r
267         class doThFilterImpl_BUFFERFORMAT_WORD1D_R5G6B5_16LE implements IdoThFilterImpl\r
268         {\r
269                 public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
270                 {\r
271                         int[] out_buf = (int[]) i_output.getBuffer();\r
272                         short[] in_buf = (short[]) i_input.getBuffer();\r
273                         \r
274                         final int th=i_threshold*3;\r
275                         int w;\r
276                         int xy;\r
277                         final int pix_count   =i_size.h*i_size.w;\r
278                         final int pix_mod_part=pix_count-(pix_count%8);\r
279 \r
280                         for(xy=pix_count-1;xy>=pix_mod_part;xy--){                              \r
281                 w =(int)in_buf[xy];\r
282                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
283                 out_buf[xy] = w <= th ? 0 : 1;\r
284                         }\r
285                         //タイリング\r
286                         for (;xy>=0;) {\r
287                 w =(int)in_buf[xy];\r
288                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
289                 out_buf[xy] = w <= th ? 0 : 1;\r
290                                 xy--;\r
291                 w =(int)in_buf[xy];\r
292                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
293                 out_buf[xy] = w <= th ? 0 : 1;\r
294                                 xy--;\r
295                 w =(int)in_buf[xy];\r
296                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
297                 out_buf[xy] = w <= th ? 0 : 1;\r
298                                 xy--;\r
299                 w =(int)in_buf[xy];\r
300                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
301                 out_buf[xy] = w <= th ? 0 : 1;\r
302                                 xy--;\r
303                 w =(int)in_buf[xy];\r
304                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
305                 out_buf[xy] = w <= th ? 0 : 1;\r
306                                 xy--;\r
307                 w =(int)in_buf[xy];\r
308                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
309                 out_buf[xy] = w <= th ? 0 : 1;\r
310                                 xy--;\r
311                 w =(int)in_buf[xy];\r
312                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
313                 out_buf[xy] = w <= th ? 0 : 1;\r
314                                 xy--;\r
315                 w =(int)in_buf[xy];\r
316                 w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
317                 out_buf[xy] = w <= th ? 0 : 1;\r
318                                 xy--;\r
319                         }\r
320                 }               \r
321         }       \r
322         \r
323         \r
324         \r
325         \r
326 \r
327         \r
328         \r
329         \r
330         \r
331         private int _threshold;\r
332         private IdoThFilterImpl _do_threshold_impl;\r
333 \r
334         public NyARRasterFilter_ARToolkitThreshold(int i_threshold,int i_input_raster_type) throws NyARException\r
335         {\r
336                 this._threshold = i_threshold;\r
337                 switch (i_input_raster_type) {\r
338                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
339                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
340                         this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24();\r
341                         break;\r
342                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
343                         this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32();\r
344                         break;\r
345                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
346                         this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32();\r
347                         break;\r
348                 case INyARBufferReader.BUFFERFORMAT_INT1D_X8R8G8B8_32:\r
349                         this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32();\r
350                         break;\r
351                 case INyARBufferReader.BUFFERFORMAT_WORD1D_R5G6B5_16LE:\r
352                         this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_WORD1D_R5G6B5_16LE();\r
353                         break;\r
354                 default:\r
355                         throw new NyARException();\r
356                 }\r
357 \r
358                 \r
359         }\r
360         public void setThreshold(int i_threshold)\r
361         {\r
362                 this._threshold = i_threshold;\r
363         }\r
364 \r
365         public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) throws NyARException\r
366         {\r
367                 INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
368                 INyARBufferReader out_buffer_reader=i_output.getBufferReader();\r
369 \r
370                 assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_BIN_8));\r
371                 assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
372                 this._do_threshold_impl.doThFilter(in_buffer_reader,out_buffer_reader,i_output.getSize(), this._threshold);\r
373                 return;\r
374         }\r
375 \r
376 }\r