//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;
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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();
}