改变亮度是在每个像素上的点操作。如果想提高亮度,必须在每个像素上加上一些常数值。

new_img(i,j)=img(i,j)+c

如果想降低亮度,则必须对每个像素减去一些常数值。

new_img(i,j)=img(i,j)-c

举个例子,假设这是原始图像

OpenCV改变图像或视频的亮度-程序旅途

假设你想提高20单位的图像亮度。下面是增加20单位亮度之后的图像:

OpenCV改变图像或视频的亮度-程序旅途

假设你像降低20单位的图像亮度。下面是降低20单位亮度之后的图像:

OpenCV改变图像或视频的亮度-程序旅途

注意:

你可能已经注意到上面图像的第一个像素应该是(12-20)=-8,但是我给它的值为0。这是因为像素不可能为负值。任何像素值的下限是0,上限是2^(位深)。

改变图像的亮度

现在我使用OpenCV C++的例子演示一下如何提高或降低图像的亮度。

//
//  main.cpp
//  ChangeBrightness
//
//  Created by mingceng on 14-4-11.
//  Copyright (c) 2014年 Bob. All rights reserved.
//

#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[])
{
    Mat img=imread("/Users/mingceng/Pictures/origin.jpg",CV_LOAD_IMAGE_COLOR);
    if (img.empty()) {
        cout<<"加载图像失败!"<<endl;
        return -1;
    }

    Mat imgH=img+Scalar(75,75,75);
//    img.convertTo(imgH, -1,1,75);

    Mat imgL=img+Scalar(-75,-75,-75);
//    img.convertTo(imgL, -1,1,-75);

    string originalWindow="Original Image";
    string highBrightness="High Brightness";
    string lowBrightness="Low Brightness";

    namedWindow(originalWindow,CV_WINDOW_AUTOSIZE);
    namedWindow(highBrightness,CV_WINDOW_AUTOSIZE);
    namedWindow(lowBrightness,CV_WINDOW_AUTOSIZE);

    imshow(originalWindow, img);
    imshow(highBrightness, imgH);
    imshow(lowBrightness, imgL);

    waitKey(0);

    destroyAllWindows();

    return 0;
}

这是原始图像:

OpenCV改变图像或视频的亮度-程序旅途

这是OpenCV程序提高了亮度的图像:

OpenCV改变图像或视频的亮度-程序旅途

这是OpenCV程序降低了亮度的图像:

OpenCV改变图像或视频的亮度-程序旅途

新的OpenCV函数

Mat imgH = img + Scalar(75, 75, 75);

这行代码为”img” 3个通道(B G R)上的每个像素值加75,然后分配这个新的图像给”imgH”。也可以使用下面的函数代替(下一篇介绍这个函数)。

img.convertTo(imgH, -1, 1, 75);

Mat imgL = img + Scalar(-75, -75, -75);

这行代码为“img” 3个通道(B G R)上的每个像素值减75,然后分配这个新的图像给“imgL”。也可以使用下面的函数代替。

img.convertTo(imgL, -1, 1, -75);

改变视频的亮度

下面我使用OpenCV C++的例子演示一下如何提高或降低视频的亮度。这个前一个例子非常相似。

//
//  main.cpp
//  ChangeBrightness
//
//  Created by mingceng on 14-4-11.
//  Copyright (c) 2014年 Bob. All rights reserved.
//

#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[])
{
    VideoCapture cap("/Users/mingceng/Movies/SampleVideo.wmv");

    if (!cap.isOpened())
    {
        cout << "打开视频失败!" << endl;
        return -1;
    }

    string originalWindow="Original Video";
    string highBrightness="Brightness Increased";
    string lowBrightness="Brightness Decreased";

    namedWindow(originalWindow,CV_WINDOW_AUTOSIZE);
    namedWindow(highBrightness,CV_WINDOW_AUTOSIZE);
    namedWindow(lowBrightness,CV_WINDOW_AUTOSIZE);

    while(1)
    {
        Mat frame;

        bool bSuccess = cap.read(frame);

        if (!bSuccess)
        {
            cout << "不能从视频文件读取帧!" << endl;
            break;
        }

        Mat imgH = frame + Scalar(50, 50, 50);
        Mat imgL = frame + Scalar(-50, -50, -50);

        imshow(originalWindow, frame);
        imshow(highBrightness, imgH);
        imshow(lowBrightness, imgL);

        if (waitKey(30) == 27)
        {
            cout << "按下ESC键" << endl;
            break;
        }
    }

    return 0;
}

本文翻译自:http://opencv-srf.blogspot.com/2013/07/change-brightness.html

友情提示:查看原文请使用VPN