c++opencvimage-processingcontrast

Simple illumination correction in images OpenCV C++


I have some color photos and the illumination is not regular in the photos: one side of the image is brighter than the other side.

I would like to solve this problem by correcting the illumination. I think local contrast will help me but I don't know how :(

Would you please help me with a piece of code or a pipeline ?


Solution

  • Convert the RGB image to Lab color-space (e.g., any color-space with a luminance channel will work fine), then apply adaptive histogram equalization to the L channel. Finally convert the resulting Lab back to RGB.

    What you want is OpenCV's CLAHE (Contrast Limited Adaptive Histogram Equalization) algorithm. However, as far as I know it is not documented. There is an example in python. You can read about CLAHE in Graphics Gems IV, pp474-485

    Here is an example of CLAHE in action: enter image description here

    And here is the C++ that produced the above image, based on http://answers.opencv.org/question/12024/use-of-clahe/, but extended for color.

    #include <opencv2/core.hpp>
    #include <vector>       // std::vector
    int main(int argc, char** argv)
    {
        // READ RGB color image and convert it to Lab
        cv::Mat bgr_image = cv::imread("image.png");
        cv::Mat lab_image;
        cv::cvtColor(bgr_image, lab_image, CV_BGR2Lab);
    
        // Extract the L channel
        std::vector<cv::Mat> lab_planes(3);
        cv::split(lab_image, lab_planes);  // now we have the L image in lab_planes[0]
    
        // apply the CLAHE algorithm to the L channel
        cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
        clahe->setClipLimit(4);
        cv::Mat dst;
        clahe->apply(lab_planes[0], dst);
    
        // Merge the the color planes back into an Lab image
        dst.copyTo(lab_planes[0]);
        cv::merge(lab_planes, lab_image);
    
       // convert back to RGB
       cv::Mat image_clahe;
       cv::cvtColor(lab_image, image_clahe, CV_Lab2BGR);
    
       // display the results  (you might also want to see lab_planes[0] before and after).
       cv::imshow("image original", bgr_image);
       cv::imshow("image CLAHE", image_clahe);
       cv::waitKey();
    }