OSDN Git Service

e5a47df03339c2b2bd76cb0f03667f7d0f90115c
[nyartoolkit-and/nyartoolkit-and.git] / trunk / sample / sandbox / jp / nyatla / nyartoolkit / core / rasterfilter / rgb2gs / NyARRasterFilter_Rgb2Gs_CbCrCut.java
1 package jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs;\r
2 \r
3 import jp.nyatla.nyartoolkit.NyARException;\r
4 import jp.nyatla.nyartoolkit.core.raster.*;\r
5 import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;\r
6 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
7 \r
8 /**\r
9  * YCbCr変換したY成分を、RGBカラーベクトルの差が少いほど強度が落ちるようにしてグレースケールに変換します。\r
10  * sには減衰度数を設定します。\r
11  * 強度計算は以下のように行います。\r
12  * f(x):=exp(-x^2/s^2)  窓関数\r
13  * p :=Y*f(cr)*f(cb)\r
14  */\r
15 public class NyARRasterFilter_Rgb2Gs_CbCrCut implements INyARRasterFilter_Rgb2Gs\r
16 {\r
17         private IdoFilterImpl _dofilterimpl;\r
18         /**\r
19          * 1024倍した値\r
20          */\r
21         private int _window[]=new int[256];\r
22         public NyARRasterFilter_Rgb2Gs_CbCrCut(int i_raster_type,double i_sigma) throws NyARException\r
23         {\r
24                 switch (i_raster_type) {\r
25                 case NyARBufferType.BYTE1D_B8G8R8_24:\r
26                         this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();\r
27                         break;\r
28                 case NyARBufferType.BYTE1D_R8G8B8_24:\r
29                 default:\r
30                         throw new NyARException();\r
31                 }\r
32                 this._dofilterimpl._window_ref=this._window;\r
33                 //windowの作成\r
34                 for(int i=0;i<256;i++){\r
35                         double p=((double)i-127.0)/127.0;\r
36                         this._window[i]=(int)(1024*Math.exp(-p*p/(i_sigma*i_sigma)));\r
37                 }\r
38         }\r
39         public void doFilter(INyARRgbRaster i_input, NyARGrayscaleRaster i_output) throws NyARException\r
40         {\r
41                 assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
42                 this._dofilterimpl.doFilter(i_input,i_output,i_input.getSize());\r
43         }\r
44         \r
45         abstract class IdoFilterImpl\r
46         {\r
47                 int[] _window_ref;\r
48                 public abstract void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException;\r
49                 \r
50         }\r
51         class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl\r
52         {\r
53                 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException\r
54                 {\r
55                         assert( i_input.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8_24));\r
56                         assert( i_output.isEqualBufferType(NyARBufferType.INT1D_GRAY_8));\r
57                         \r
58                         int[] out_buf = (int[]) i_output.getBuffer();\r
59                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
60                         \r
61                         int r,g,b;\r
62                         int[] win=this._window_ref;\r
63 \r
64                         int bp = 0;\r
65                         for (int y = 0; y < i_size.h; y++){\r
66                                 for (int x = 0; x < i_size.w; x++){\r
67                                         b=(in_buf[bp] & 0xff);\r
68                                         g=(in_buf[bp + 1] & 0xff);\r
69                                         r=(in_buf[bp + 2] & 0xff);\r
70                                         bp += 3;\r
71                                         int yv=(306*r+601*g+117 * b)>>10;//0<yv<255\r
72                                         int cr=(((-173 * r-339 * g + 512 *b))>>10)+127;//-127.5<=0<=127.5\r
73                                         int cb=((( 512 * r-429 * g -  83 *b))>>10)+127;//-127.5<=0<=127.5\r
74                                         out_buf[y*i_size.w+x]=(yv*(int)win[cr]*win[cb])>>20;\r
75                                 }\r
76                         }\r
77                         return;\r
78                 }\r
79         }       \r
80 }