예제 #1
0
        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);
        }
예제 #2
0
        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;
            }
예제 #6
0
        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);
        }