+++ /dev/null
-package jp.nyatla.nyartoolkit.core.analyzer.raster;\r
-\r
-import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.*;\r
-import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
-import jp.nyatla.nyartoolkit.core.types.*;\r
-/**\r
- * 画像のヒストグラムを計算します。\r
- * RGBの場合、(R+G+B)/3のヒストグラムを計算します。\r
- * \r
- * \r
- */\r
-public class NyARRasterAnalyzer_Histogram\r
-{\r
- protected ICreateHistogramImpl _histImpl;\r
- /**\r
- * ヒストグラム解析の縦方向スキップ数。継承クラスはこのライン数づつ\r
- * スキップしながらヒストグラム計算を行うこと。\r
- */\r
- protected int _vertical_skip;\r
- \r
- \r
- public NyARRasterAnalyzer_Histogram(int i_raster_format,int i_vertical_interval) throws NyARException\r
- {\r
- if(!initInstance(i_raster_format,i_vertical_interval)){\r
- throw new NyARException();\r
- }\r
- }\r
- protected boolean initInstance(int i_raster_format,int i_vertical_interval)\r
- {\r
- switch (i_raster_format) {\r
- case NyARBufferType.BYTE1D_B8G8R8_24:\r
- case NyARBufferType.BYTE1D_R8G8B8_24:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_BYTE1D_RGB_24();\r
- break;\r
- case NyARBufferType.INT1D_GRAY_8:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_INT1D_GRAY_8();\r
- break;\r
- case NyARBufferType.BYTE1D_B8G8R8X8_32:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_BYTE1D_B8G8R8X8_32();\r
- break;\r
- case NyARBufferType.BYTE1D_X8R8G8B8_32:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_BYTE1D_X8R8G8B8_32();\r
- break;\r
- case NyARBufferType.WORD1D_R5G6B5_16LE:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_WORD1D_R5G6B5_16LE();\r
- break;\r
- case NyARBufferType.INT1D_X8R8G8B8_32:\r
- this._histImpl = new NyARRasterThresholdAnalyzer_Histogram_INT1D_X8R8G8B8_32();\r
- break;\r
- default:\r
- return false;\r
- }\r
- //初期化\r
- this._vertical_skip=i_vertical_interval;\r
- return true;\r
- } \r
- \r
- \r
- public void setVerticalInterval(int i_step)\r
- {\r
- assert(this._vertical_skip>0);\r
- this._vertical_skip=i_step;\r
- return;\r
- }\r
-\r
- /**\r
- * o_histogramにヒストグラムを出力します。\r
- * @param i_input\r
- * @param o_histogram\r
- * @return\r
- * @throws NyARException\r
- */\r
- public void analyzeRaster(INyARRaster i_input,NyARHistogram o_histogram) throws NyARException\r
- {\r
- \r
- final NyARIntSize size=i_input.getSize();\r
- //最大画像サイズの制限\r
- assert(size.w*size.h<0x40000000);\r
- assert(o_histogram.length==256);//現在は固定\r
-\r
- int[] h=o_histogram.data;\r
- //ヒストグラム初期化\r
- for (int i = o_histogram.length-1; i >=0; i--){\r
- h[i] = 0;\r
- }\r
- o_histogram.total_of_data=size.w*size.h/this._vertical_skip;\r
- this._histImpl.createHistogram(i_input,0,0,size.w,size.h,o_histogram.data,this._vertical_skip);\r
- return;\r
- }\r
- public void analyzeRaster(INyARRaster i_input,NyARIntRect i_area,NyARHistogram o_histogram) throws NyARException\r
- {\r
- \r
- final NyARIntSize size=i_input.getSize();\r
- //最大画像サイズの制限\r
- assert(size.w*size.h<0x40000000);\r
- assert(o_histogram.length==256);//現在は固定\r
-\r
- int[] h=o_histogram.data;\r
- //ヒストグラム初期化\r
- for (int i = o_histogram.length-1; i >=0; i--){\r
- h[i] = 0;\r
- }\r
- o_histogram.total_of_data=i_area.w*i_area.h/this._vertical_skip;\r
- this._histImpl.createHistogram(i_input,i_area.x,i_area.y,i_area.w,i_area.h,o_histogram.data,this._vertical_skip);\r
- return;\r
- }\r
- \r
- protected interface ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip);\r
- }\r
-\r
- class NyARRasterThresholdAnalyzer_Histogram_INT1D_GRAY_8 implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert (i_raster.isEqualBufferType(NyARBufferType.INT1D_GRAY_8));\r
- final int[] input=(int[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w);\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l);\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- o_histogram[input[pt++]]++;\r
- }\r
- for (;x>=0;x-=8){\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- o_histogram[input[pt++]]++;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
-\r
- } \r
- }\r
- class NyARRasterThresholdAnalyzer_Histogram_INT1D_X8R8G8B8_32 implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert (i_raster.isEqualBufferType( NyARBufferType.INT1D_X8R8G8B8_32));\r
- final int[] input=(int[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w);\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l);\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x,v;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- }\r
- for (;x>=0;x-=8){\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- v=input[pt++];o_histogram[((v& 0xff)+(v& 0xff)+(v& 0xff))/3]++;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
- } \r
- }\r
-\r
- \r
- class NyARRasterThresholdAnalyzer_Histogram_BYTE1D_RGB_24 implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert (\r
- i_raster.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8_24)||\r
- i_raster.isEqualBufferType(NyARBufferType.BYTE1D_R8G8B8_24));\r
- final byte[] input=(byte[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w)*3;\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l)*3;\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=3;\r
- }\r
- for (;x>=0;x-=8){\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=3*8;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
- }\r
- }\r
-\r
- class NyARRasterThresholdAnalyzer_Histogram_BYTE1D_B8G8R8X8_32 implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert(i_raster.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8X8_32));\r
- final byte[] input=(byte[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w)*4;\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l)*4;\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- }\r
- for (;x>=0;x-=8){\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3]++;\r
- pt+=4;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
- }\r
- }\r
-\r
- class NyARRasterThresholdAnalyzer_Histogram_BYTE1D_X8R8G8B8_32 implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert(i_raster.isEqualBufferType(NyARBufferType.BYTE1D_X8R8G8B8_32));\r
- final byte[] input=(byte[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w)*4;\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l)*4;\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+ 3]& 0xff))/3]++;\r
- pt+=4;\r
- }\r
- for (;x>=0;x-=8){\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- o_histogram[((input[pt+1]& 0xff)+(input[pt+2]& 0xff)+(input[pt+3]& 0xff))/3]++;\r
- pt+=4;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
- }\r
- }\r
-\r
- class NyARRasterThresholdAnalyzer_Histogram_WORD1D_R5G6B5_16LE implements ICreateHistogramImpl\r
- {\r
- public void createHistogram(INyARRaster i_raster,int i_l,int i_t,int i_w,int i_h, int[] o_histogram,int i_skip)\r
- {\r
- assert(i_raster.isEqualBufferType(NyARBufferType.WORD1D_R5G6B5_16LE));\r
- final short[] input=(short[])i_raster.getBuffer();\r
- NyARIntSize s=i_raster.getSize();\r
- int skip=(i_skip*s.w-i_w);\r
- final int pix_count=i_w;\r
- final int pix_mod_part=pix_count-(pix_count%8); \r
- //左上から1行づつ走査していく\r
- int pt=(i_t*s.w+i_l);\r
- for (int y = i_h-1; y >=0 ; y-=i_skip){\r
- int x,v;\r
- for (x = pix_count-1; x >=pix_mod_part; x--){\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- }\r
- for (;x>=0;x-=8){\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- v =(int)input[pt++]; o_histogram[(((v & 0xf800) >> 8) + ((v & 0x07e0) >> 3) + ((v & 0x001f) << 3))/3]++;\r
- }\r
- //スキップ\r
- pt+=skip;\r
- }\r
- return; \r
- }\r
- }\r
-\r
- public static void main(String[] args)\r
- {\r
- try{\r
- NyARRgbRaster raster=new NyARRgbRaster(100,100,NyARBufferType.WORD1D_R5G6B5_16LE);\r
- short[] buf=(short[])raster.getBuffer();\r
- for(int i=0;i<100;i++){\r
- for(int i2=0;i2<100;i2++){\r
- buf[(i*100+i2)+0]=(short)(3); //buf[(i*100+i2)*3+1]=buf[(i*100+i2)*3+2]=(byte)i2;\r
- }\r
- }\r
- NyARIntRect rect=new NyARIntRect();\r
- rect.x=2;rect.y=2;rect.h=10;rect.w=10;\r
- NyARRasterAnalyzer_Histogram ha=new NyARRasterAnalyzer_Histogram(raster.getBufferType(),1);\r
- NyARHistogram h=new NyARHistogram(256);\r
- ha.analyzeRaster(raster,rect, h);\r
-// ha.analyzeRaster(raster, h);\r
- return;\r
- \r
- }catch(Exception e){\r
- e.printStackTrace();\r
- }\r
- }\r
-\r
-}
\ No newline at end of file