改变亮度是在每个像素上的点操作。如果想提高亮度,必须在每个像素上加上一些常数值。
new_img(i,j)=img(i,j)+c
如果想降低亮度,则必须对每个像素减去一些常数值。
new_img(i,j)=img(i,j)-c
举个例子,假设这是原始图像
假设你想提高20单位的图像亮度。下面是增加20单位亮度之后的图像:
假设你像降低20单位的图像亮度。下面是降低20单位亮度之后的图像:
注意:
你可能已经注意到上面图像的第一个像素应该是(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函数
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
请问你这个是什么语言啊!没看懂
C++