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

增大对比度其实就是对每个像素进行操作,最简单的方式是就是对每个像素的值乘以一个大于1的数


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


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

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



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


e.g- 如图是,原始图像
【OpenCV_07】改变图像或者视频的对比度 Change Contrast of Image or Video_第1张图片
Example Image



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

【OpenCV_07】改变图像或者视频的对比度 Change Contrast of Image or Video_第2张图片
Contrast Increased


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


【OpenCV_07】改变图像或者视频的对比度 Change Contrast of Image or Video_第3张图片
Contrast Decreased


Change Contrast of an Image


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

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include 


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_07】改变图像或者视频的对比度 Change Contrast of Image or Video_第4张图片


左下角为原图,右上角为低对比度,右下角为高对比度。
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 

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
        {
                cout << "esc key is pressed by user" << endl; 
                break; 
        }
    }
    return 0;
}



你可能感兴趣的:(OpenCV)