public void doFilter(INyARGrayscaleRaster i_output) { INyARGsPixelDriver ind = this._raster.getGsPixelDriver(); INyARGsPixelDriver outd = i_output.getGsPixelDriver(); NyARIntSize s = this._raster.getSize(); for (int y = s.h - 1; y >= 0; y--) { for (int x = s.w - 1; x >= 0; x--) { outd.setPixel(x, y, 255 - ind.getPixel(x, y)); } } }
public void createHistogram(int i_l, int i_t, int i_w, int i_h, int i_skip, NyARHistogram o_histogram) { o_histogram.reset(); int[] data_ptr = o_histogram.data; INyARGsPixelDriver drv = this._gsr.getGsPixelDriver(); int pix_count = i_w; int pix_mod_part = pix_count - (pix_count % 8); //左上から1行づつ走査していく for (int y = i_h - 1; y >= 0; y -= i_skip) { for (int x = pix_count - 1; x >= pix_mod_part; x--) { data_ptr[drv.getPixel(x, y)]++; } } o_histogram.total_of_data = i_w * i_h / i_skip; return; }
public override bool getContour(int i_l, int i_t, int i_r, int i_b, int i_entry_x, int i_entry_y, int i_th, NyARIntCoordinates o_coord) { Debug.Assert(i_t <= i_entry_x); INyARGsPixelDriver reader = this._ref_raster.getGsPixelDriver(); int[] xdir = _getContour_xdir; // static int xdir[8] = { 0, 1, 1, 1, 0,-1,-1,-1}; int[] ydir = _getContour_ydir; // static int ydir[8] = {-1,-1, 0, 1, 1, 1, 0,-1}; //クリップ領域の上端に接しているポイントを得る。 NyARIntPoint2d[] coord = o_coord.items; int max_coord = o_coord.items.Length; coord[0].x = i_entry_x; coord[0].y = i_entry_y; int coord_num = 1; int dir = 5; int c = i_entry_x; int r = i_entry_y; for (; ;) { dir = (dir + 5) % 8;//dirの正規化 //境界に接しているとき int i; for (i = 0; i < 8; i++) { int x = c + xdir[dir]; int y = r + ydir[dir]; //境界チェック if (x >= i_l && x <= i_r && y >= i_t && y <= i_b) { if (reader.getPixel(x, y) <= i_th) { break; } } dir++;//倍長テーブルを参照するので問題なし } if (i == 8) { //8方向全て調べたけどラベルが無いよ? throw new NyARException();// return(-1); } // xcoordとycoordをc,rにも保存 c = c + xdir[dir]; r = r + ydir[dir]; coord[coord_num].x = c; coord[coord_num].y = r; //終了条件判定 if (c == i_entry_x && r == i_entry_y) { //開始点と同じピクセルに到達したら、終点の可能性がある。 coord_num++; //末端のチェック if (coord_num == max_coord) { //輪郭bufが末端に達した return(false); } //末端候補の次のピクセルを調べる dir = (dir + 5) % 8;//dirの正規化 for (i = 0; i < 8; i++) { int x = c + xdir[dir]; int y = r + ydir[dir]; //境界チェック if (x >= i_l && x <= i_r && y >= i_t && y <= i_b) { if (reader.getPixel(x, y) <= i_th) { break; } } dir++;//倍長テーブルを参照するので問題なし } if (i == 8) { //8方向全て調べたけどラベルが無いよ? throw new NyARException(); } //得たピクセルが、[1]と同じならば、末端である。 c = c + xdir[dir]; r = r + ydir[dir]; if (coord[1].x == c && coord[1].y == r) { //終点に達している。 o_coord.length = coord_num; break; } else { //終点ではない。 coord[coord_num].x = c; coord[coord_num].y = r; } } coord_num++; //末端のチェック if (coord_num == max_coord) { //輪郭が末端に達した return(false); } } return(true); }