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; } } } }
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; }
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; }
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); } }