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