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

原创 2016年05月31日 17:41:31
增大对比度其实就是对每个像素进行操作,最简单的方式是就是对每个像素的值乘以一个大于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
  • 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
        {
                cout << "esc key is pressed by user" << endl; 
                break; 
        }
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1

自然图像抠图/视频抠像技术发展情况梳理 Sason@CSDN 持续更新. 当前更新日期2013.03.05, 添加Fast Mating、Global Matting、视频扣像。 当前更新日期2...

自然图像抠图/视频抠像技术梳理(image matting, video matting)

1. Bayesian Matting, Chuang, CVPR 2001. http://grail.cs.washington.edu/projects/digital-matting/p...
  • jaccen
  • jaccen
  • 2015年12月07日 17:08
  • 2044

【OpenCV_12】旋转视频以及图片 Rotate Image & Video

旋转图像 Rotate Image 通过给定角度来选择图像是常见的图像处理问题,虽然看起来有点复杂,但是得益于OpenCV内置的一些函数,使得实现起来非常简单。下面就是代码,为了使得表达更加...
  • tealex
  • tealex
  • 2016年06月07日 16:46
  • 1101

图形(graphic、图像image和视频video有什么区别

原帖地址:http://www.xiangb.com/faq/faq_1342.html 视频(video):   视频简单的理解就是连续的图像,被称为视频。对视频图像的处理,核心是压缩,其他的就...

Optimized contrast enhancement for real-time image and video dehazing

【摘要】本文提出了一种针对含有雾的图像和视频快速、完善的去雾算法。观察发现有雾的图像普遍具有低对比度,我们通过增强对比度来修复图像。然后多度的增强这些低对比度会截断像素值以及导致信息丢失。因此,我们引...

PS 图像调整算法——自动对比度 (Auto Contrast)

PS 给出的定义: Enhance Monochromatic ContrastClips all channels identically. This preserves the overall ...

调整图像亮度brightness,对比度contrast,饱和度saturation方法整理

简单的实现方案 数据格式:YUV 参考链接1:Processing in the 8-bit YUV Color Space 参考链接2:关于YUV图像的亮度和对比度的调整算法 参考链接2中采...
  • ajaxhe
  • ajaxhe
  • 2012年05月07日 11:28
  • 2880

JavaScript图像处理(2) - 亮度对比度调整(Brightness/Contrast)

基本的图像处理操作之一是颜色操作,也就是根据一定的规则修改图像中像素的值。例如说改变图像的亮度、对比度,进行色彩替换,或者是对图像进行曲线操作,复杂一点的还有色彩空间矢量化等。 修改图像的亮度和对比度...

opencv-改变图像的对比度和亮度

#include #include #include using namespace cv; using namespace std; double alpha; /**< Simple c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_07】改变图像或者视频的对比度 Change Contrast of Image or Video
举报原因:
原因补充:

(最多只允许输入30个字)