OSDN Git Service

920cb8d753e1cbae3ec5e16bac3e6146cd555359
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / analyzer / raster / NyARRasterAnalyzer_Histgram.java
1 package jp.nyatla.nyartoolkit.core.analyzer.raster;\r
2 \r
3 import jp.nyatla.nyartoolkit.NyARException;\r
4 import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
5 import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
6 import jp.nyatla.nyartoolkit.core.types.NyARHistgram;\r
7 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
8 import jp.nyatla.nyartoolkit.core.analyzer.histgram.*;\r
9 /**\r
10  * 画像のヒストグラムを計算します。\r
11  * RGBの場合、(R+G+B)/3のヒストグラムを計算します。\r
12  * \r
13  * \r
14  */\r
15 public class NyARRasterAnalyzer_Histgram\r
16 {\r
17         private ICreateHistgramImpl _histImpl;\r
18         /**\r
19          * ヒストグラム解析の縦方向スキップ数。継承クラスはこのライン数づつ\r
20          * スキップしながらヒストグラム計算を行うこと。\r
21          */\r
22         protected int _vertical_skip;\r
23         \r
24         \r
25         public NyARRasterAnalyzer_Histgram(int i_raster_format,int i_vertical_interval) throws NyARException\r
26         {\r
27                 switch (i_raster_format) {\r
28                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
29                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
30                         this._histImpl = new NyARRasterThresholdAnalyzer_Histgram_BYTE1D_RGB_24();\r
31                         break;\r
32                 case INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8:\r
33                         this._histImpl = new NyARRasterThresholdAnalyzer_Histgram_INT1D_GRAY_8();\r
34                         break;\r
35                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
36                         this._histImpl = new NyARRasterThresholdAnalyzer_Histgram_BYTE1D_B8G8R8X8_32();\r
37                         break;\r
38                 case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
39                         this._histImpl = new NyARRasterThresholdAnalyzer_Histgram_BYTE1D_X8R8G8B8_32();\r
40                         break;\r
41                 case INyARBufferReader.BUFFERFORMAT_WORD1D_R5G6B5_16LE:\r
42                         this._histImpl = new NyARRasterThresholdAnalyzer_Histgram_WORD1D_R5G6B5_16LE();\r
43                         break;\r
44                 default:\r
45                         throw new NyARException();\r
46                 }\r
47                 //初期化\r
48                 this._vertical_skip=i_vertical_interval;\r
49         }       \r
50         public void setVerticalInterval(int i_step)\r
51         {\r
52                 this._vertical_skip=i_step;\r
53                 return;\r
54         }\r
55 \r
56         /**\r
57          * o_histgramにヒストグラムを出力します。\r
58          * @param i_input\r
59          * @param o_histgram\r
60          * @return\r
61          * @throws NyARException\r
62          */\r
63         public int analyzeRaster(INyARRaster i_input,NyARHistgram o_histgram) throws NyARException\r
64         {\r
65                 \r
66                 final NyARIntSize size=i_input.getSize();\r
67                 //最大画像サイズの制限\r
68                 assert size.w*size.h<0x40000000;\r
69                 assert o_histgram.length==256;//現在は固定\r
70 \r
71                 int[] h=o_histgram.data;\r
72                 //ヒストグラム初期化\r
73                 for (int i = o_histgram.length-1; i >=0; i--){\r
74                         h[i] = 0;\r
75                 }\r
76                 o_histgram.total_of_data=size.w*size.h;\r
77                 return this._histImpl.createHistgram(i_input.getBufferReader(), size,h,this._vertical_skip);            \r
78         }\r
79         \r
80         interface ICreateHistgramImpl\r
81         {\r
82                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip);\r
83         }\r
84 \r
85         class NyARRasterThresholdAnalyzer_Histgram_INT1D_GRAY_8 implements ICreateHistgramImpl\r
86         {\r
87                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip)\r
88                 {\r
89                         assert (i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
90                         final int[] input=(int[]) i_reader.getBuffer();\r
91                         for (int y = i_size.h-1; y >=0 ; y-=i_skip){\r
92                                 int pt=y*i_size.w;\r
93                                 for (int x = i_size.w-1; x >=0; x--) {\r
94                                         o_histgram[input[pt]]++;\r
95                                         pt++;\r
96                                 }\r
97                         }\r
98                         return i_size.w*i_size.h;\r
99                 }       \r
100         }\r
101 \r
102         class NyARRasterThresholdAnalyzer_Histgram_BYTE1D_RGB_24 implements ICreateHistgramImpl\r
103         {\r
104                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip)\r
105                 {\r
106                         assert (\r
107                                         i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24)||\r
108                                         i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24));\r
109                         final byte[] input=(byte[]) i_reader.getBuffer();\r
110                         final int pix_count=i_size.w;\r
111                         final int pix_mod_part=pix_count-(pix_count%8);\r
112                         for (int y = i_size.h-1; y >=0 ; y-=i_skip) {\r
113                                 int pt=y*i_size.w*3;\r
114                                 int x,v;\r
115                                 for (x = pix_count-1; x >=pix_mod_part; x--) {\r
116                                         v=((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3;\r
117                                         o_histgram[v]++;\r
118                                         pt+=3;\r
119                                 }\r
120                                 //タイリング\r
121                                 for (;x>=0;x-=8){\r
122                                         v=((input[pt+ 0]& 0xff)+(input[pt+ 1]& 0xff)+(input[pt+ 2]& 0xff))/3;\r
123                                         o_histgram[v]++;\r
124                                         v=((input[pt+ 3]& 0xff)+(input[pt+ 4]& 0xff)+(input[pt+ 5]& 0xff))/3;\r
125                                         o_histgram[v]++;\r
126                                         v=((input[pt+ 6]& 0xff)+(input[pt+ 7]& 0xff)+(input[pt+ 8]& 0xff))/3;\r
127                                         o_histgram[v]++;\r
128                                         v=((input[pt+ 9]& 0xff)+(input[pt+10]& 0xff)+(input[pt+11]& 0xff))/3;\r
129                                         o_histgram[v]++;\r
130                                         v=((input[pt+12]& 0xff)+(input[pt+13]& 0xff)+(input[pt+14]& 0xff))/3;\r
131                                         o_histgram[v]++;\r
132                                         v=((input[pt+15]& 0xff)+(input[pt+16]& 0xff)+(input[pt+17]& 0xff))/3;\r
133                                         o_histgram[v]++;\r
134                                         v=((input[pt+18]& 0xff)+(input[pt+19]& 0xff)+(input[pt+20]& 0xff))/3;\r
135                                         o_histgram[v]++;\r
136                                         v=((input[pt+21]& 0xff)+(input[pt+22]& 0xff)+(input[pt+23]& 0xff))/3;\r
137                                         o_histgram[v]++;\r
138                                         pt+=3*8;\r
139                                 }\r
140                         }\r
141                         return i_size.w*i_size.h;\r
142                 }\r
143         }\r
144 \r
145         class NyARRasterThresholdAnalyzer_Histgram_BYTE1D_B8G8R8X8_32 implements ICreateHistgramImpl\r
146         {\r
147                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip)\r
148                 {\r
149                 assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32));\r
150                 byte[] input = (byte[])i_reader.getBuffer();\r
151                 int pix_count = i_size.w;\r
152                 int pix_mod_part = pix_count - (pix_count % 8);\r
153                 for (int y = i_size.h - 1; y >= 0; y -= i_skip)\r
154                 {\r
155                     int pt = y * i_size.w * 4;\r
156                     int x, v;\r
157                     for (x = pix_count - 1; x >= pix_mod_part; x--)\r
158                     {\r
159                         v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
160                         o_histgram[v]++;\r
161                         pt += 4;\r
162                     }\r
163                     //タイリング\r
164                     for (; x >= 0; x -= 8)\r
165                     {\r
166                         v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
167                         o_histgram[v]++;\r
168                         v = ((input[pt + 4] & 0xff) + (input[pt + 5] & 0xff) + (input[pt + 6] & 0xff)) / 3;\r
169                         o_histgram[v]++;\r
170                         v = ((input[pt + 8] & 0xff) + (input[pt + 9] & 0xff) + (input[pt + 10] & 0xff)) / 3;\r
171                         o_histgram[v]++;\r
172                         v = ((input[pt + 12] & 0xff) + (input[pt + 13] & 0xff) + (input[pt + 14] & 0xff)) / 3;\r
173                         o_histgram[v]++;\r
174                         v = ((input[pt + 16] & 0xff) + (input[pt + 17] & 0xff) + (input[pt + 18] & 0xff)) / 3;\r
175                         o_histgram[v]++;\r
176                         v = ((input[pt + 20] & 0xff) + (input[pt + 21] & 0xff) + (input[pt + 22] & 0xff)) / 3;\r
177                         o_histgram[v]++;\r
178                         v = ((input[pt + 24] & 0xff) + (input[pt + 25] & 0xff) + (input[pt + 26] & 0xff)) / 3;\r
179                         o_histgram[v]++;\r
180                         v = ((input[pt + 28] & 0xff) + (input[pt + 29] & 0xff) + (input[pt + 30] & 0xff)) / 3;\r
181                         o_histgram[v]++;\r
182                         pt += 4 * 8;\r
183                     }\r
184                 }\r
185                 return i_size.w*i_size.h;\r
186             }\r
187         }\r
188 \r
189         class NyARRasterThresholdAnalyzer_Histgram_BYTE1D_X8R8G8B8_32 implements ICreateHistgramImpl\r
190         {\r
191                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip)\r
192                 {\r
193                 assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32));\r
194                 byte[] input = (byte[])i_reader.getBuffer();\r
195                 int pix_count = i_size.w;\r
196                 int pix_mod_part = pix_count - (pix_count % 8);\r
197                 for (int y = i_size.h - 1; y >= 0; y -=i_skip)\r
198                 {\r
199                     int pt = y * i_size.w * 4;\r
200                     int x, v;\r
201                     for (x = pix_count - 1; x >= pix_mod_part; x--)\r
202                     {\r
203                         v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
204                         o_histgram[v]++;\r
205                         pt += 4;\r
206                     }\r
207                     //タイリング\r
208                     for (; x >= 0; x -= 8)\r
209                     {\r
210                         v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
211                         o_histgram[v]++;\r
212                         v = ((input[pt + 5] & 0xff) + (input[pt + 6] & 0xff) + (input[pt + 7] & 0xff)) / 3;\r
213                         o_histgram[v]++;\r
214                         v = ((input[pt + 9] & 0xff) + (input[pt + 10] & 0xff) + (input[pt + 11] & 0xff)) / 3;\r
215                         o_histgram[v]++;\r
216                         v = ((input[pt + 13] & 0xff) + (input[pt + 14] & 0xff) + (input[pt + 15] & 0xff)) / 3;\r
217                         o_histgram[v]++;\r
218                         v = ((input[pt + 17] & 0xff) + (input[pt + 18] & 0xff) + (input[pt + 19] & 0xff)) / 3;\r
219                         o_histgram[v]++;\r
220                         v = ((input[pt + 21] & 0xff) + (input[pt + 22] & 0xff) + (input[pt + 23] & 0xff)) / 3;\r
221                         o_histgram[v]++;\r
222                         v = ((input[pt + 25] & 0xff) + (input[pt + 26] & 0xff) + (input[pt + 27] & 0xff)) / 3;\r
223                         o_histgram[v]++;\r
224                         v = ((input[pt + 29] & 0xff) + (input[pt + 30] & 0xff) + (input[pt + 31] & 0xff)) / 3;\r
225                         o_histgram[v]++;\r
226                         pt += 4 * 8;\r
227                     }\r
228                 }\r
229                 return i_size.w*i_size.h;\r
230             }\r
231         }\r
232 \r
233         class NyARRasterThresholdAnalyzer_Histgram_WORD1D_R5G6B5_16LE implements ICreateHistgramImpl\r
234         {\r
235                 public int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram,int i_skip)\r
236                 {\r
237                 assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_WORD1D_R5G6B5_16LE));\r
238                 short[] input = (short[])i_reader.getBuffer();\r
239                 int pix_count = i_size.w;\r
240                 int pix_mod_part = pix_count - (pix_count % 8);\r
241                 for (int y = i_size.h - 1; y >= 0; y -= i_skip)\r
242                 {\r
243                     int pt = y * i_size.w;\r
244                     int x, v;\r
245                     for (x = pix_count - 1; x >= pix_mod_part; x--)\r
246                     {\r
247                         v =(int)input[pt];\r
248                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
249                         o_histgram[v]++;\r
250                         pt++;\r
251                     }\r
252                     //タイリング\r
253                     for (; x >= 0; x -= 8)\r
254                     {\r
255                         v =(int)input[pt];pt++;\r
256                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
257                         o_histgram[v]++;\r
258                         v =(int)input[pt];pt++;\r
259                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
260                         o_histgram[v]++;\r
261                         v =(int)input[pt];pt++;\r
262                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
263                         o_histgram[v]++;\r
264                         v =(int)input[pt];pt++;\r
265                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
266                         o_histgram[v]++;\r
267                         v =(int)input[pt];pt++;\r
268                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
269                         o_histgram[v]++;\r
270                         v =(int)input[pt];pt++;\r
271                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
272                         o_histgram[v]++;\r
273                         v =(int)input[pt];pt++;\r
274                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
275                         o_histgram[v]++;\r
276                         v =(int)input[pt];pt++;\r
277                         v = (((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3;\r
278                         o_histgram[v]++;\r
279                     }\r
280                 }\r
281                 return i_size.w*i_size.h;\r
282             }\r
283         }\r
284 \r
285 \r
286 }