コード例 #1
0
ファイル: vil_gmm.cpp プロジェクト: iefiac/vxl_util
void VilGMM::probabilty(const vil_image_view<vxl_byte> & image, const vil_image_view<vxl_byte> & maskImage, int mask,
                        vil_image_view<double> & outProb, int patchSize)
{
    assert(image.ni() == maskImage.ni());
    assert(image.nj() == maskImage.nj());
    assert(image.nplanes() == 3);
    assert(gmm_);
    assert(patchSize%2 == 1);
    
    vil_image_view<double> pixelProb(image.ni(), image.nj(), 1);
    pixelProb.fill(0.0);
    
    // probability in each pixel position
    int w = image.ni();
    int h = image.nj();
    for (int j = 0; j<h; j++) {
        for (int i = 0; i<w; i++) {
            if (maskImage(i, j) == mask) {
                vnl_vector<double> color(3);
                for (int k = 0; k<3; k++) {
                    color[k] = image(i, j, k);
                }
                pixelProb(i, j) = (*gmm_)(color);              
            }
        }
    }
    
    outProb = vil_image_view<double>(w, h, 1);
    outProb.fill(0.0);
    // average probility
    for (int j = patchSize/2; j<h-patchSize/2; j++) {
        for (int i = patchSize/2; i<w-patchSize/w; i++) {
            if (maskImage(i, j) == mask) {
                // average the value inside the patch
                double val = 0;
                int num = 0;
                for (int k = -patchSize/2; k <= patchSize/2; k++) {
                    for (int m = -patchSize/2; m<= patchSize/2; m++) {
                        if (maskImage(i + m, j+ k) == mask) {
                            val += pixelProb(i+m, j+k);
                            num++;
                        }
                    }
                }
                assert(num != 0);
                val /= num;
                outProb(i, j) = val;
            }
        }
    }
}
コード例 #2
0
ファイル: vil_gmm.cpp プロジェクト: iefiac/vxl_util
bool VilGMM::train(const vil_image_view<vxl_byte> & image, const vil_image_view<vxl_byte> & maskImage, int mask)
{
    assert(image.ni() == maskImage.ni());
    assert(image.nj() == maskImage.nj());
    assert(image.nplanes() == 3);
    
    vpdfl_gaussian_builder g_builder;
    vpdfl_mixture_builder builder;
    
    builder.init(g_builder,comp_n_);
    builder.set_weights_fixed(false);
    
    vcl_vector<vnl_vector<double> > data;
    for (int j = 0; j<image.nj(); j++) {
        for (int i = 0; i<image.ni(); i++) {
            if (maskImage(i, j) == mask) {
                vnl_vector<double> color(3);
                for (int k = 0; k<3; k++) {
                    color[k] = image(i, j, k);
                }
                data.push_back(color);
            }
        }
    }
    
    if (data.size() <= comp_n_ * 20) {
        return false;
    }
    
    if (gmm_) {
        delete gmm_;
        gmm_ = NULL;
    }
    gmm_ = builder.new_model();
    
    mbl_data_array_wrapper<vnl_vector<double> > data_array(data);
    builder.build(*gmm_, data_array);
    if (verbose_) {
        vcl_cout<<"training sample number is "<<data.size()<<vcl_endl;
        vcl_cout<<"Probability distribution function is "<<gmm_<<vcl_endl;
        vcl_cout<<"Mean: "<<gmm_->mean()<<vcl_endl;
        vcl_cout<<"Var:  "<<gmm_->variance()<<vcl_endl;
    }
    return true;
}
コード例 #3
0
ファイル: vil_gmm.cpp プロジェクト: iefiac/vxl_util
bool VilGMM::addOneImage(const vil_image_view<vxl_byte> & image, const vil_image_view<vxl_byte> & maskImage, int mask)
{
    assert(image.ni() == maskImage.ni());
    assert(image.nj() == maskImage.nj());
    assert(image.nplanes() == 3);
    
    for (int j = 0; j<image.nj(); j++) {
        for (int i = 0; i<image.ni(); i++) {
            if (maskImage(i, j) == mask) {
                vnl_vector<double> color(3);
                for (int k = 0; k<3; k++) {
                    color[k] = image(i, j, k);
                }
                data_.push_back(color);
            }           
        }
    }
    return true;
}
コード例 #4
0
ファイル: vil_draw.cpp プロジェクト: LiliMeng/MAVLocalization
void VilDraw::draw_match_vertical(const vil_image_view<vxl_byte> &image1, const vil_image_view<vxl_byte> &image2,
                                  const vcl_vector< vgl_point_2d<double> > & pts1,
                                  const vcl_vector< vgl_point_2d<double> > & pts2,
                                  vil_image_view<vxl_byte> &matches, const int sample_num)
{
    assert(image1.nplanes() == 3 || image1.nplanes() == 1);
    assert(image2.nplanes() == 3 || image2.nplanes() == 1);
    assert(pts1.size() == pts2.size());
    
    vil_image_view<vxl_byte> rgb_image1 = image1;
    vil_image_view<vxl_byte> rgb_image2 = image2;
    if (image1.nplanes() == 1) {
        rgb_image1 = VilUtil::gray_2_rgb(image1);
    }
    if (image2.nplanes() == 1) {
        rgb_image2 = VilUtil::gray_2_rgb(image2);
    }

    
    int gap_width = 10;
    int y_shift = gap_width + image1.nj();
    int width  = vcl_max(image1.ni(), image2.ni());
    int height = image1.nj() + gap_width + image2.nj();
    
    matches = vil_image_view<vxl_byte>(width, height, 3);
    matches.fill(0);
    
    //copy image 1 to left
    vil_copy_to_window(rgb_image1, matches, 0, 0);
    
    //copy image 2 to right
    vil_copy_to_window(rgb_image2, matches, 0, y_shift);
    
    for (int i = 0; i<pts1.size(); i += sample_num) {
        int r = rand()%255;
        int g = rand()%255;
        int b = rand()%255;
        //int r = 0;
        //int g = 255;
        //int b = 0;
        
        vcl_vector< vxl_byte> colour;
        colour.push_back(r);
        colour.push_back(g);
        colour.push_back(b);
        
        vgl_point_2d<double> p1 = pts1[i];
        vgl_point_2d<double> p2(vgl_point_2d<double>(pts2[i].x(), pts2[i].y() + y_shift));
        
        VilAlgoPlus::fill_line(matches, p1, p2, colour);
        
        // cross in left
        
        vgl_point_2d<double> q1, q2, q3, q4;
        double h_l = 5;
        q1.set(p1.x() - h_l, p1.y());
        q2.set(p1.x() + h_l, p1.y());
        q3.set(p1.x(), p1.y() - h_l);
        q4.set(p1.x(), p1.y() + h_l);
        
        VilAlgoPlus::fill_line(matches, q1, q2, colour);
        VilAlgoPlus::fill_line(matches, q3, q4, colour);
        
        // cross in right
        q1.set(p2.x() - h_l, p2.y());
        q2.set(p2.x() + h_l, p2.y());
        q3.set(p2.x(), p2.y() - h_l);
        q4.set(p2.x(), p2.y() + h_l);
        
        VilAlgoPlus::fill_line(matches, q1, q2, colour);
        VilAlgoPlus::fill_line(matches, q3, q4, colour);
    }
}