您的位置:首页 > 运维架构

【OpenCV_07】改变图像或者视频的对比度 Change Contrast of Image or Video

2016-05-31 17:41 651 查看
增大对比度其实就是对每个像素进行操作,最简单的方式是就是对每个像素的值乘以一个大于1的数

                         new_img (i, j) = img(i, j) * c                     c > 1

对应的减小对比度最简单的方法就是对每个像素乘以一个小于1的数

                         new_img (i, j) = img(i, j) * c                     c < 1

当然有更加高级的办法来调整图像的对比度,比如说直方图均衡化。将讨论在下一篇博客直方图均衡。

e.g- 如图是,原始图像

Example Image
对每个像素乘以2,把图像对比度有效提升。这里考虑图片是8位深的图片,所以位深值应该是0~255,如结果大于255,取255.


Contrast Increased
对每个像素乘以0.5,把图像对比度有效降低。如下图


Contrast Decreased


Change Contrast of an Image

如何通过OpenCV 及C++ 来调整对比度,下面采用最简单的方法来调整对比度。

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

using namespace cv;

using namespace std;

int main( int argc, const char** argv )

{

Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the image

if (img.empty())
{
cout << "Image cannot be loaded..!!" << endl;
return -1;
}

Mat imgH;
img.convertTo(imgH, -1, 2, 0); //increase the contrast (double)

Mat imgL;
img.convertTo(imgL, -1, 0.5, 0); //decrease the contrast (halve)

//create windows
namedWindow("Original Image", CV_WINDOW_AUTOSIZE);
namedWindow("High Contrast", CV_WINDOW_AUTOSIZE);
namedWindow("Low Contrast", CV_WINDOW_AUTOSIZE);

//show the image
imshow("Original Image", img);
imshow("High Contrast", imgH);
imshow("Low Contrast", imgL);

waitKey(0); //wait for key press

destroyAllWindows(); //destroy all open windows

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




左下角为原图,右上角为低对比度,右下角为高对比度。

OpenCV 新的函数

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0
)


这个OpenCV函数是把源图像通过缩放变换为另外格式的图像,缩放依据的是下面的公式

                                              m[i,j] = alfa * img[i,j] + beta

下面是这个函数的参数

OutputArray m -存储变换出来的图像
int rtype - 图像位深,如果 rtype 是负的,输出图像与输入图像一样。上面的程序采用负值,因为并不想改变图像的位深。位深可能的参数如下。
CV_8U
CV_32S
CV_64F
-1

位深完整解释 【OpenCV教程之二】OpenCV基础API

double alpha -点算子,每个像素都乘以这个值
double beta - 每个像素乘以倍增因子之后加上一个beta

再列一下方程, m[i, j]意思是像素pixel 在 i行j列

                              

m[i,j] = alfa * img[i,j] + beta

两个参数 alpha > 0 和 beta 一般称作 增益 和 偏置 参数。

我们往往用这两个参数来分别控制 对比度 和 亮度 。 可以把m[i,j]看成源图像像素,把后面的
看成输出图像像素。


调整视频对比度

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

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
VideoCapture cap("C:/SampleVideo.wmv"); // open the video file for reading

if ( !cap.isOpened() )  // if not success, exit program
{
cout << "Cannot open the video file" << endl;
return -1;
}

//create windows
namedWindow("Original Video",CV_WINDOW_AUTOSIZE);
namedWindow("Contrast Increased",CV_WINDOW_AUTOSIZE);
namedWindow("Contrast Decreased",CV_WINDOW_AUTOSIZE);

while (1)
{
Mat frame;

bool bSuccess = cap.read(frame); // read a new frame from video

if (!bSuccess) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}

Mat imgH;
frame.convertTo(imgH, -1, 2, 0); //increase the contrast (double)

Mat imgL;
frame.convertTo(imgL, -1, 0.5, 0); //decrease the contrast (halve)

//show the image
imshow("Original Video", frame);
imshow("Contrast Increased", imgH);
imshow("Contrast Decreased", imgL);

if (waitKey(30) == 27) //wait for 'esc' key press for 30 ms. If 'esc' key is pressed, break loop

a6da
{
cout << "esc key is pressed by user" << endl;
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: