1 package jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs;
\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
9 * YCbCr変換したY成分を、RGBカラーベクトルの差が少いほど強度が落ちるようにしてグレースケールに変換します。
\r
12 * f(x):=exp(-x^2/s^2) 窓関数
\r
15 public class NyARRasterFilter_Rgb2Gs_CbCrCut implements INyARRasterFilter_Rgb2Gs
\r
17 private IdoFilterImpl _dofilterimpl;
\r
21 private int _window[]=new int[256];
\r
22 public NyARRasterFilter_Rgb2Gs_CbCrCut(int i_raster_type,double i_sigma) throws NyARException
\r
24 switch (i_raster_type) {
\r
25 case NyARBufferType.BYTE1D_B8G8R8_24:
\r
26 this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();
\r
28 case NyARBufferType.BYTE1D_R8G8B8_24:
\r
30 throw new NyARException();
\r
32 this._dofilterimpl._window_ref=this._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
39 public void doFilter(INyARRgbRaster i_input, NyARGrayscaleRaster i_output) throws NyARException
\r
41 assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);
\r
42 this._dofilterimpl.doFilter(i_input,i_output,i_input.getSize());
\r
45 abstract class IdoFilterImpl
\r
48 public abstract void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException;
\r
51 class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl
\r
53 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException
\r
55 assert( i_input.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8_24));
\r
56 assert( i_output.isEqualBufferType(NyARBufferType.INT1D_GRAY_8));
\r
58 int[] out_buf = (int[]) i_output.getBuffer();
\r
59 byte[] in_buf = (byte[]) i_input.getBuffer();
\r
62 int[] win=this._window_ref;
\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
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