X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=trunk%2Fsrc%2Fjp%2Fnyatla%2Fnyartoolkit%2Fcore%2Flabeling%2Frlelabeling%2FNyARLabeling_Rle.java;h=00f00cfb39165ac329c1ea19cb5c9ddfb6619f01;hb=684b73231b76b7bcca0eb2d23975d556404551bd;hp=38689bfbf48d3b47d6c21e0e753c1e803e70a321;hpb=85d90253da7d891cb82800369045c4893896359d;p=nyartoolkit-and%2Fnyartoolkit-and.git diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java index 38689bf..00f00cf 100644 --- a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java +++ b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java @@ -26,9 +26,9 @@ package jp.nyatla.nyartoolkit.core.labeling.rlelabeling; import jp.nyatla.nyartoolkit.NyARException; import jp.nyatla.nyartoolkit.core.raster.*; -import jp.nyatla.utils.*; +import jp.nyatla.nyartoolkit.core.types.stack.NyARObjectStack; -class RleInfoStack extends NyObjectStack +class RleInfoStack extends NyARObjectStack { public class RleInfo { @@ -42,7 +42,7 @@ class RleInfoStack extends NyObjectStack public long pos_x; public long pos_y; } - public RleInfoStack(int i_length) + public RleInfoStack(int i_length) throws NyARException { super(i_length, RleInfoStack.RleInfo.class); return; @@ -73,6 +73,7 @@ class RleElement } } + // RleImageをラベリングする。 public class NyARLabeling_Rle { @@ -85,7 +86,7 @@ public class NyARLabeling_Rle private int _max_area; private int _min_area; - public NyARLabeling_Rle(int i_width,int i_height) + public NyARLabeling_Rle(int i_width,int i_height) throws NyARException { this._rlestack=new RleInfoStack(i_width*i_height*2048/(320*240)+32); this._rle1 = RleElement.createArray(i_width/2+1); @@ -107,11 +108,18 @@ public class NyARLabeling_Rle } /** - * i_bin_bufのbinイメージをREL圧縮する。 - * - * @param i_bin_raster + * i_bin_bufのgsイメージをREL圧縮する。 + * @param i_bin_buf + * @param i_st + * @param i_len + * @param i_out + * @param i_th + * BINラスタのときは0,GSラスタの時は閾値を指定する。 + * この関数は、閾値を暗点と認識します。 + * 暗点<=th<明点 + * @return */ - private int toRel(int[] i_bin_buf, int i_st, int i_len, RleElement[] i_out) + private int toRel(int[] i_bin_buf, int i_st, int i_len, RleElement[] i_out,int i_th) { int current = 0; int r = -1; @@ -120,8 +128,8 @@ public class NyARLabeling_Rle final int right_edge = i_st + i_len - 1; while (x < right_edge) { // 暗点(0)スキャン - if (i_bin_buf[x] != 0) { - x++; + if (i_bin_buf[x] > i_th) { + x++;//明点 continue; } // 暗点発見→暗点長を調べる @@ -130,7 +138,7 @@ public class NyARLabeling_Rle r++;// 暗点+1 x++; while (x < right_edge) { - if (i_bin_buf[x] != 0) { + if (i_bin_buf[x] > i_th) { // 明点(1)→暗点(0)配列終了>登録 i_out[current].r = r; current++; @@ -145,7 +153,7 @@ public class NyARLabeling_Rle } } // 最後の1点だけ判定方法が少し違うの。 - if (i_bin_buf[x] != 0) { + if (i_bin_buf[x] > i_th) { // 明点→rカウント中なら暗点配列終了>登録 if (r >= 0) { i_out[current].r = r; @@ -183,9 +191,39 @@ public class NyARLabeling_Rle return; } - - // - public int labeling(NyARBinRaster i_bin_raster, int i_top, int i_bottom,RleLabelFragmentInfoStack o_stack) throws NyARException + //所望のラスタからBIN-RLEに変換しながらの低速系も準備しようかな + + /** + * 単一閾値を使ってGSラスタをBINラスタに変換しながらラベリングします。 + * @param i_gs_raster + * @param i_top + * @param i_bottom + * @param o_stack + * @return + * @throws NyARException + */ + public int labeling(NyARBinRaster i_bin_raster, int i_top, int i_bottom,NyARRleLabelFragmentInfoStack o_stack) throws NyARException + { + assert(i_bin_raster.isEqualBufferType(NyARBufferType.INT1D_BIN_8)); + return this.imple_labeling(i_bin_raster,0,i_top,i_bottom,o_stack); + } + /** + * BINラスタをラベリングします。 + * @param i_gs_raster + * @param i_th + * 画像を2値化するための閾値。暗点<=th<明点となります。 + * @param i_top + * @param i_bottom + * @param o_stack + * @return + * @throws NyARException + */ + public int labeling(NyARGrayscaleRaster i_gs_raster,int i_th, int i_top, int i_bottom,NyARRleLabelFragmentInfoStack o_stack) throws NyARException + { + assert(i_gs_raster.isEqualBufferType(NyARBufferType.INT1D_GRAY_8)); + return this.imple_labeling(i_gs_raster,i_th,i_top,i_bottom,o_stack); + } + private int imple_labeling(INyARRaster i_raster,int i_th,int i_top, int i_bottom,NyARRleLabelFragmentInfoStack o_stack) throws NyARException { // リセット処理 final RleInfoStack rlestack=this._rlestack; @@ -196,14 +234,14 @@ public class NyARLabeling_Rle RleElement[] rle_current = this._rle2; int len_prev = 0; int len_current = 0; - final int width = i_bin_raster.getWidth(); - int[] in_buf = (int[]) i_bin_raster.getBufferReader().getBuffer(); + final int width = i_raster.getWidth(); + int[] in_buf = (int[]) i_raster.getBuffer(); int id_max = 0; int label_count=0; // 初段登録 - len_prev = toRel(in_buf, i_top, width, rle_prev); + len_prev = toRel(in_buf, i_top, width, rle_prev,i_th); for (int i = 0; i < len_prev; i++) { // フラグメントID=フラグメント初期値、POS=Y値、RELインデクス=行 addFragment(rle_prev[i], id_max, i_top,rlestack); @@ -215,7 +253,7 @@ public class NyARLabeling_Rle // 次段結合 for (int y = i_top + 1; y < i_bottom; y++) { // カレント行の読込 - len_current = toRel(in_buf, y * width, width, rle_current); + len_current = toRel(in_buf, y * width, width, rle_current,i_th); int index_prev = 0; SCAN_CUR: for (int i = 0; i < len_current; i++) { @@ -338,8 +376,8 @@ public class NyARLabeling_Rle rle_current = tmp; } //対象のラベルだけ転写 - o_stack.reserv(label_count); - RleLabelFragmentInfoStack.RleLabelFragmentInfo[] o_dest_array=o_stack.getArray(); + o_stack.init(label_count); + NyARRleLabelFragmentInfoStack.RleLabelFragmentInfo[] o_dest_array=o_stack.getArray(); final int max=this._max_area; final int min=this._min_area; int active_labels=0; @@ -350,7 +388,7 @@ public class NyARLabeling_Rle } // final RleInfoStack.RleInfo src_info=f_array[i]; - final RleLabelFragmentInfoStack.RleLabelFragmentInfo dest_info=o_dest_array[active_labels]; + final NyARRleLabelFragmentInfoStack.RleLabelFragmentInfo dest_info=o_dest_array[active_labels]; dest_info.area=area; dest_info.clip_b=src_info.clip_b; dest_info.clip_r=src_info.clip_r;