wonki cho
wonki cho

Reputation: 31

change image brightness with c++

i want to change brightness of image, only accessing pixel value. not using opencv function(ex. convertTo)

input : image , num

num means constant value for brightness

here is my code and result looks wierd. Is there any problem?

original

result

cv::Mat function(cv::Mat img, int num){
    cv::Mat output;
    output = cv::Mat::zeros(img.rows, img.cols, img.type());
    for (int i = 0; i < img.rows; i++)
    {
        for (int j = 0; j < img.cols; j++)
        {
            for (int c = 0; c < img.channels(); c++)
            {
                output.at<cv::Vec3b>(i, j)[c] = img.at<cv::Vec3b>(i, j)[c] + num;
            
                if (output.at<cv::Vec3b>(i, j)[c] > 255){
                    output.at<cv::Vec3b>(i, j)[c] = 255;
                }
                else if (output.at<cv::Vec3b>(i, j)[c] < 0)
                {
                    output.at<cv::Vec3b>(i, j)[c] = 0;
                }

            }
        
        }

    }
    cv::imshow("output", output);
    cv::waitKey(0);
    return img;
}

Upvotes: 0

Views: 558

Answers (1)

berak
berak

Reputation: 1374

not using opencv function

that's somewhat silly, since your code is already using opencv's data structures.

trying to do so, you also reinvented the wheel, albeit a slightly square one ...

Check for overflow before assigning to output.

yea that's the problem. correct way to do it would be: assign the sum to something larger than uchar, and then check

else if (output.at<cv::Vec3b>(i, j)[c] < 0)

this will never happen, try to understand why


but please note, that your whole code (triple loop, omg !!!) could be rewritten as a simple:

Mat output = img + Scalar::all(num);

(faster, safer, & this will also saturate correctly !)

Upvotes: 6

Related Questions