示例#1
0
int _smoothmain(int w, int h, int color, imgtype *imgdata)
{
	fill_img_info(w, h, color, imgdata);
	meanshift();
	writeoutimg();
	free_mem();

	printf("done.\n");
	return 0;
}
/*! @brief Mean Shift (MS) and Centroid Finding Function
 * 
 * This function runs through a binary image and finds the blobs
 * centroids using the mean shift method
 * 
 * @param binaryImage the binary either (0-255) or (0-1) input image to be MS processed 
 * @param blobs 2D list of 2D points 
 * @param blobCentres list of 2D points representing centroids of each blob
 */
void ossimSDFilter::findBlobsMS(cv::Mat& binaryImage, vector< vector< cv::Point2i > >& blobs, vector< cv::Point2i >& blobCentres)
{
  //Clear all blobs
  blobs.clear();
  blobCentres.clear();

  //Ensure input image is 8CU1
  binaryImage.convertTo(binaryImage,CV_8UC1);
  
  //Find nonzero coordinates in binary image
  find(binaryImage, blobCentres);
  
  int rows = 2; 
  int cols = blobCentres.size();
  
  std::vector<double> flatBlobs;
  std::vector<double> labelledClusters;
  std::vector<double> meansFinal;
  
  
  flatBlobs.resize(rows*cols);
  labelledClusters.resize(rows*cols);
  
  int counter = 0;
  for(std::vector<cv::Point2i>::iterator it = blobCentres.begin(); it != blobCentres.end(); ++it, counter++) 
  {
   flatBlobs[counter*rows + 0] = it->x;
   flatBlobs[counter*rows + 1] = it->y;
  }
  
  meanshift(flatBlobs, rows, cols, bw, descendRate, iterMax, labelledClusters, meansFinal);

  cv::Mat test = cv::Mat(binaryImage.rows, binaryImage.cols, CV_8UC1, cv::Scalar::all(0));
  
  blobCentres.clear();
  for(int i = 0; i < counter; i++) 
   blobCentres.push_back(cv::Point2i(floor(meansFinal[i*rows]+0.5),floor(meansFinal[i*rows+1]+0.5))); 
  
  paintCentres(test, blobCentres);
  blobCentres.clear();
  find(test, blobCentres);
}
示例#3
0
int main(int argc, char** argv) {
    FILE* log = fopen("./logs/log", "a");
    //default configuration
    char* input_file_path;
    char output_filename[100];
    double sigma_meanshift = 0.4;
    double sigma_affmat = 0.005;
    double diffuse_t = 5000.0;
    int nev = 20;

    Mat source_img; 
    Mat output_img;

    time_t start_time;
    time_t current_time;
    time_t end_time;

    //parse command line arguments
    for(int i = 0; i < argc; i++) {
        if(strcmp(argv[i],"-f")==0) {
	        i++;
	        input_file_path = argv[i];
            printf("-f: %s\n", input_file_path);
	    } 
        if(strcmp(argv[i],"-sa")==0) {
	        i++;
	        sigma_affmat = atof(argv[i]);
            printf("-sa: %f\n", sigma_affmat);
	    }
        if(strcmp(argv[i],"-sm")==0) {
	        i++;
	        sigma_meanshift = atof(argv[i]);
            printf("-sm: %f\n", sigma_meanshift);
	    }
        if(strcmp(argv[i],"-t")==0) {
	        i++;
	        diffuse_t = atof(argv[i]);
            printf("-t: %f\n", diffuse_t);
	    }
	    if(strcmp(argv[i],"-n")==0) {
	        i++;
	        nev = atoi(argv[i]);
            printf("-n: %d\n", nev);
	    }
    }
    if(access(input_file_path, F_OK) == -1) {
        printf("Invalid input file path: %s\n", input_file_path);
        arg_error();
    }

    printf("Args parsing completed!\n");
    printf("%s %s -sa %f -sm %f -t %f -n %d\n", argv[0], input_file_path, sigma_affmat, sigma_meanshift, diffuse_t, nev);

    start_time = time(NULL);

    /* Load image data */
    source_img = loadDoubleImage(input_file_path);
    output_img = Mat::zeros(source_img.size(), CV_8UC3);
    //printMatdouble(source_img);    


    /* Log record */
    fprintf(log,"[%lu-%s]\nnev=%d, sigma_affmat=%f, sigma_meanshift=%f, diffuse_t=%f", start_time, basename(input_file_path), nev, sigma_affmat, sigma_meanshift, diffuse_t);
    sprintf(output_filename, "./out/%lu_sa%d_sm%d_nev%d_difft%d-%s", start_time, (int)(sigma_affmat*1000),(int)(sigma_meanshift*1000), nev,(int)diffuse_t, basename(input_file_path));

    /* Compute affinity matrix */
    CSCMat affinityMat = getCSCAffinityMatrix(source_img, sigma_affmat);
    //printCSCMatrix(affinityMat);

    /* Compute laplacian matrix */
    CSCMat laplacianMat = getCSCLaplacianSym(affinityMat);
    //printCSCMatrix(laplacianMat);

    current_time = time(NULL);
    
    /* Compute eigen vectors*/
    vector<vector<double > > dataPoints = spectralDecomposition(laplacianMat, nev, diffuse_t);
    //print2DVecArray(dataPoints);

    /* Log record */
    fprintf(log,"Spectral decomposition time: %lu\n", time(NULL) - current_time);

    current_time = time(NULL);
    
    /*Compute clusters*/
    vector<vector<double > > datameans = meanshift(dataPoints, sigma_meanshift); 
    //vecPrint2DArray(datameans);
    
    /* Log record */
    fprintf(log,"Clustering time: %lu\n", time(NULL) - current_time);
    vector<vector<int > > clusters = cluster2(datameans, 1.0);

    /* Colorize segments*/    
    visualiseSegments(output_img, clusters);
    
    /* Log record */
    fprintf(log, "Total time: %lu\n\n", time(NULL) - start_time);

    imwrite(output_filename, output_img);

    fclose(log);
    printf("Done!\n");
    waitKey(0);
	return 0;
}