Simplest Color Balance

void SimplestColorBalance(cv::Mat inArray, cv::Mat &outArray, int percent)
{
    if (percent<= 0)
    percent = 5;

    inArray.convertTo(inArray, CV_32F);
    int rows = inArray.rows;
    int cols = inArray.cols;
    int chnls = inArray.channels();
    double halfPercent = percent /200.0;
    std::vector<cv::Mat> channels;
    std::vector<cv::Mat> results;
    if (chnls == 3){
        channels.reserve(3);
        cv::split(inArray, channels);
    }
    else {
        channels.reserve(1);
        inArray.copyTo(channels[0]);
    }

    for (int i = 0; i < chnls; i++){
        cv::Mat flat;
        channels[i].reshape(1,1).copyTo(flat);
        cv::sort(flat, flat, cv::SORT_ASCENDING);
        double lowVal = flat.at<float>(0, floor(flat.cols * halfPercent));
        double topVal = flat.at<float>(0, ceil(flat.cols * (1.0-halfPercent)));
        cv::Mat channel = channels[i];
        for (int m = 0; m < rows; m++){
            for (int n = 0; n < cols; n++){
                if (channel.at<float>(m, n) < lowVal)
                    channel.at<float>(m, n) = lowVal;
                if (channel.at<float>(m, n) > topVal)
                    channel.at<float>(m, n) = topVal;
            }
        }
        cv::normalize(channel, channel, 0, 255, cv::NORM_MINMAX);
        //channel.convertTo(channel, CV_32F);
        results.push_back(channel);
    }
    cv::merge(results, outArray);
    outArray.convertTo(outArray, CV_8U);
}