for anyone looking at this, the solution i ultimately used, was just to use the non uniform bins input in the calcHist function.
First i looked through and matched the input values to the nearest stored value.
void textonFind(Mat& clus, Mat dictionary){
if(clus.empty() || dictionary.empty()){
ERR("Texton Find inputs were empty.");
exit(-1);
}
// Loop through input centers
for(int h=0;h<clus.rows;h++){
float distance = 0.0, nearest = 0.0;
distance = abs(dictionary.at<float>(0,0) - clus.at<float>(h,0));
nearest = dictionary.at<float>(0,0);
// Compare current centre with all values in texton dictionary
for(int k = 0; k < dictionary.rows; k++){
if(abs(dictionary.at<float>(k,0) - clus.at<float>(h,0)) < distance){
nearest = dictionary.at<float>(k,0);
distance = abs(dictionary.at<float>(k,0) - clus.at<float>(h,0));
}
}
// Replace input Center with closest Texton Center
clus.at<float>(h,0) = nearest;
}
}
Then to generate the bin ranges i looped through the original values i wanted to match the new values to and simply added 0.00001 this acted as the upper exclusion limit putting any values which were above this in the next bin, as i knew all the possible values i didn't need to find the nearest as that was already done.
// Create bins for each textonDictionary Value
void binLimits(vector<float>& tex){
dicDEBUG("inside binLimits", 0);
vector<float> bins;
bins.push_back(0);
for(int i = 0;i <= tex.size()-1;i++){
bins.push_back(tex[i] + 0.00001);
}
bins.push_back(256);
for(int i=0;i<bins.size();i++)
cout << "texDict: " << i << ": "<< tex[i] << " becomes: " << bins[i+1] << endl;
tex.clear();
tex = bins;
}
The above code isn't necessarily pretty but it works in case anyone has a similar problem.
I am not really sure that I have well understood "upper and lower bounds for all the bins", but isn't normalise going to do it?
yeah i think something like that but being able to assign a collection of values to their nearest value in a seperate array.
Is that possible with the mask parameter in normalize is?
Yes, it should be possible