//Returns an averaged EMD value for the 2 images provided. const int ColourAnalyser::compareImages(CImg<int> image1, CImg<int> image2, int *mask1, int *mask2) { std::cout << "Generating histograms for images..." << std::endl; std::vector<int> red1, red2, green1, green2, blue1, blue2; //Get the histograms for each image getHistograms(image1, red1, green1, blue1, mask1); getHistograms(image2, red2, green2, blue2, mask2); //Normalise all the histograms std::cout << "Normalising histograms..." << std::endl; red1 = normaliseHistogram(red1); red2 = normaliseHistogram(red2); green1 = normaliseHistogram(green1); green2 = normaliseHistogram(green2); blue1 = normaliseHistogram(blue1); blue2 = normaliseHistogram(blue2); //Create the signatures from the histograms. std::cout << "Creating signatures from histograms..." << std::endl; signature_tt<int> redSig1, redSig2, greenSig1, greenSig2, blueSig1, blueSig2; calculateSignatures(redSig1, redSig2, red1, red2); calculateSignatures(greenSig1, greenSig2, green1, green2); calculateSignatures(blueSig1, blueSig2, blue1, blue2); //Calculate the EMD for each colour std::cout << "Calculating EDM for red..." << std::endl; int redEMD = getEMD(redSig1, redSig2); std::cout << "Calculating EDM for green..." << std::endl; int greenEMD = getEMD(greenSig1, greenSig2); std::cout << "Calculating EDM for blue..." << std::endl; int blueEMD = getEMD(blueSig1, blueSig2); //Average the three values to get an average EMD for the image and return it std::cout << "Averaging EDM..." << std::endl; return (redEMD + greenEMD + blueEMD) / 3; }
void PDI::ecualizeImage(cv::Mat &img){ // Copy the image to temp image cv::Mat out = cv::Mat(img); // Get histograms (Normal and accumulated) to image histograms Hists; initHistograms(Hists.Hist, Hists.HistA); getHistograms(img, Hists.Hist, Hists.HistA); normalizateArray(Hists.Hist); normalizateArray(Hists.HistA); vHistograms.push_back(Hists); for(int i=0; i<img.rows; i++){ // Rows i for(int j=0; j<img.cols; j ++){ // Columns j out.at<uchar>(i,j) = Hists.HistA[int(img.at<uchar>(i,j))]; } } img = out.clone(); }
std::string Volume::getDataInfo() const { using P = Document::PathComponent; using H = utildoc::TableBuilder::Header; Document doc; doc.append("b", "Volume", { {"style", "color:white;"} }); utildoc::TableBuilder tb(doc.handle(), P::end()); tb(H("Format"), getDataFormat()->getString()); tb(H("Dimension"), getDimensions()); tb(H("Data Range"), dataMap_.dataRange); tb(H("Value Range"), dataMap_.valueRange); tb(H("Unit"), dataMap_.valueUnit); if (hasRepresentation<VolumeRAM>()) { auto volumeRAM = getRepresentation<VolumeRAM>(); if (volumeRAM->hasHistograms()) { auto histograms = volumeRAM->getHistograms(); for (size_t i = 0; i < histograms->size(); ++i) { std::stringstream ss; ss << "Channel " << i << " Min: " << (*histograms)[i].stats_.min << " Mean: " << (*histograms)[i].stats_.mean << " Max: " << (*histograms)[i].stats_.max << " Std: " << (*histograms)[i].stats_.standardDeviation; tb(H("Stats"), ss.str()); std::stringstream ss2; ss2 << "(1: " << (*histograms)[i].stats_.percentiles[1] << ", 25: " << (*histograms)[i].stats_.percentiles[25] << ", 50: " << (*histograms)[i].stats_.percentiles[50] << ", 75: " << (*histograms)[i].stats_.percentiles[75] << ", 99: " << (*histograms)[i].stats_.percentiles[99] << ")"; tb(H("Percentiles"), ss2.str()); } } } return doc; }
//----------- void ModuleImageAnalyzer::update() { bool toUpdate = false; if (mode == 0) { cam.update(); toUpdate = cam.isFrameNew(); } else if (mode == 1) { player.update(); toUpdate = player.isFrameNew(); } else if (mode == 2) { toUpdate = false; // this has to be done at least once upon processing } if(toUpdate) { // get frame differencing if (mode == 0) { absdiff(previous, cam, diff); diff.update(); copy(cam, previous); } else if (mode == 1) { absdiff(previous, player, diff); diff.update(); copy(player, previous); } columnMean = meanCols(diff); diffMean = mean(toCv(diff)); diffMean *= Scalar(50); frameDiffTotalRed = diffMean[0]; frameDiffTotalGreen = diffMean[1]; frameDiffTotalBlue = diffMean[2]; frameDiffTotal = frameDiffTotalRed + frameDiffTotalGreen + frameDiffTotalBlue; /* frameDiffTotalRed = ofLerp(frameDiffTotalRed, diffMean[0], 0.2); frameDiffTotalGreen = ofLerp(frameDiffTotalGreen, diffMean[1], 0.2); frameDiffTotalBlue = ofLerp(frameDiffTotalBlue, diffMean[2], 0.2); frameDiffTotal = ofLerp(frameDiffTotal, frameDiffTotalRed + frameDiffTotalGreen + frameDiffTotalBlue, 0.2); */ Vec3b column; for(int i = 0; i < columnMean.rows; i++) { column = columnMean.at<Vec3b>(i); frameDiffCol[i] = float(column[0] + column[1] + column[2]); } flow.setWindowSize(8); if (mode == 0) { flow.calcOpticalFlow(cam); } else if (mode == 1) { flow.calcOpticalFlow(player); } else if (mode == 2) { // this shouldn't work flow.calcOpticalFlow(image); } int i = 0; float distortionStrength = 4; for(int y = 1; y + 1 < ySteps; y++) { for(int x = 1; x + 1 < xSteps; x++) { int i = y * xSteps + x; ofVec2f position(x * stepSize, y * stepSize); ofRectangle area(position - ofVec2f(stepSize, stepSize) / 2, stepSize, stepSize); ofVec2f offset = flow.getAverageFlowInRegion(area); mesh.setVertex(i, position + distortionStrength * offset); i++; } } getHistograms(); } Learn::update(); }