public bool make_template(INyARGrayscaleRaster imageBW, int cx, int cy, double sd_thresh) { int ts1 = this._ts1; int ts2 = this._ts2; int xsize = imageBW.getWidth(); int ysize = imageBW.getHeight(); if (cy - ts1 < 0 || cy + ts2 >= ysize || cx - ts1 < 0 || cx + ts2 >= xsize) { return(false); } double ave = 0.0f; for (int j = -ts1; j <= ts2; j++) { // int ip = (cy+j)*xsize+(cx-ts1); for (int i = -ts1; i <= ts2; i++) { // ave += *(ip++); ave += imageBW.getPixel(cx + i, cy + j); } } ave /= (ts1 + ts2 + 1) * (ts1 + ts2 + 1); int tp = 0; double vlen1 = 0.0f; for (int j = -ts1; j <= ts2; j++) { for (int i = -ts1; i <= ts2; i++) { double p = (imageBW.getPixel(cx + i, cy + j)) - ave; this.img[tp] = p; vlen1 += p * p; tp++; } } if (vlen1 == 0.0f) { return(false); } if (vlen1 / ((ts1 + ts2 + 1) * (ts1 + ts2 + 1)) < sd_thresh * sd_thresh) { return(false); } this.vlen = Math.Sqrt(vlen1); return(true); }
public double get_similarity(INyARGrayscaleRaster imageBW, int cx, int cy) { int ts1 = this._ts1; int ts2 = this._ts2; int xsize = imageBW.getWidth(); int ysize = imageBW.getHeight(); if (cy - ts1 < 0 || cy + ts2 >= ysize || cx - ts1 < 0 || cx + ts2 >= xsize) { return(-1); } int tp = 0; double p_sum = 0.0f; double pxp_sum = 0; double img_sum = 0; double img_p_sum = 0; for (int j = -ts1; j <= ts2; j++) { for (int i = -ts1; i <= ts2; i++) { int p = (imageBW.getPixel(cx + i, cy + j)); double t = this.img[tp++]; pxp_sum += p * p; p_sum += p; img_sum += t; img_p_sum += t * p; } } double ave = p_sum / ((ts1 + ts2 + 1) * (ts1 + ts2 + 1)); double w1 = img_p_sum - img_sum * ave; double vlen2 = Math.Sqrt((pxp_sum - 2 * p_sum * ave) + (ave * ave * (ts1 + ts2 + 1) * (ts1 + ts2 + 1))); return(w1 / (this.vlen * vlen2)); }
public void doFilter(INyARGrayscaleRaster i_output) { INyARGrayscaleRaster ind = this._raster; INyARGrayscaleRaster outd = i_output; 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 doFilter(int[] i_tone_table, INyARGrayscaleRaster i_output) { INyARGrayscaleRaster outd = i_output; INyARGrayscaleRaster ind = this._raster; 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, i_tone_table[ind.getPixel(x, y)]); } } }
/** * GrayscaleRasterから任意サイズのパッチイメージを生成する。 * @param i_src * @param i_src_dpi * @param i_dest_dpi */ public ReferenceImage(INyARGrayscaleRaster i_src, double i_src_dpi, double i_dest_dpi) : this( (int)lroundf(i_src.getWidth() * i_dest_dpi / i_src_dpi), (int)lroundf(i_src.getHeight() * i_dest_dpi / i_src_dpi), i_dest_dpi) { ; int p2 = 0;//dst->imgBW; int wx = this.width; int wy = this.height; int sh = i_src.getHeight(); int sw = i_src.getWidth(); for (int jj = 0; jj < wy; jj++) { int sy = (int)lroundf(jj * i_src_dpi / dpi); int ey = (int)lroundf((jj + 1) * i_src_dpi / dpi) - 1; if (ey >= sh) { ey = sh - 1; } for (int ii = 0; ii < wx; ii++) { int sx = (int)lroundf(ii * i_src_dpi / dpi); int ex = (int)lroundf((ii + 1) * i_src_dpi / dpi) - 1; if (ex >= sw) { ex = sw - 1; } int co = 0; int value = 0; for (int jjj = sy; jjj <= ey; jjj++) { for (int iii = sx; iii <= ex; iii++) { value += i_src.getPixel(iii, jjj) & 0xff; co++; } } this.img[p2++] = (value / co); } } return; }
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; INyARGrayscaleRaster drv = this._gsr; 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; }
/** * * @param mtemp * @param sx * @param sy * @param 評価点。エラーの場合0 * @return * @throws NyARException */ private static int ar2GetBestMatchingSubFine(INyARGrayscaleRaster i_raster, NyARTemplatePatchImage mtemp, int sx, int sy) { System.Console.WriteLine("This function is not tested! Check accury of result before using."); int[] tmp_buf = mtemp.img; int sum2 = 0; int sum1 = 0; int sum3 = 0; int t_ptr = 0; for (int j = mtemp.ysize - 1; j >= 0; j--) { int i = mtemp.xsize - 1; for (; i >= 0; i--) { int tn = tmp_buf[t_ptr]; if (tn != NyARTemplatePatchImage.AR2_TEMPLATE_NULL_PIXEL) { int sn = i_raster.getPixel( (sx + (i - mtemp.xts) * NyARTemplatePatchImage.AR2_TEMP_SCALE), (sy + (j - mtemp.yts) * NyARTemplatePatchImage.AR2_TEMP_SCALE)); sum2 += sn * sn; sum1 += sn; sum3 += tn * sn; } t_ptr++; } } sum3 -= sum1 * mtemp.sum_of_img / mtemp.valid_pixels; int vlen = sum2 - sum1 * sum1 / mtemp.valid_pixels; if (vlen == 0) { return(0); } else { return(sum3 * 100 / mtemp.vlen * 100 / (int)Math.Sqrt(vlen)); } }
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); INyARGrayscaleRaster raster = this._ref_raster; 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 (raster.getPixel(x, y) <= i_th) { break; } } dir++;//倍長テーブルを参照するので問題なし } if (i == 8) { //8方向全て調べたけどラベルが無いよ? throw new NyARRuntimeException();// 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 (raster.getPixel(x, y) <= i_th) { break; } } dir++;//倍長テーブルを参照するので問題なし } if (i == 8) { //8方向全て調べたけどラベルが無いよ? throw new NyARRuntimeException(); } //得たピクセルが、[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); }