1 | initial version |
You can perform band math using element-wise operations like this
vector<Mat> channels;
split(imageBGR, channels);
Mat numeratorMat = channels[2] - channels[0]; // red - blue
Mat denominatorMat = channels[2] + channels[0]; // red + blue
Mat ratio;
cv::divide(denominatorMat, numeratorMat, ratio, 1., 5); // here 5 specifies type of ratio (CV_32FC1)
Then you can do something like
Mat newHue = (ratio.clone() - 0.5 ) * (-360); // float 32
Mat newLigthness = Mat::ones(imageBGR.rows, imageBGR.cols, CV_32FC1);
Mat newSaturation = Mat::ones(imageBGR.rows, imageBGR.cols, CV_32FC1);
vector<Mat> newChannels;
newChannels.push_back(newHue);
newChannels.push_back(newSaturation);
newChannels.push_back(newLigthness);
Mat newHSL;
cv::merge(newChannels, newHSL);