【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- 如图是,原始图像
对每个像素乘以2,把图像对比度有效提升。这里考虑图片是8位深的图片,所以位深值应该是0~255,如结果大于255,取255.
对每个像素乘以0.5,把图像对比度有效降低。如下图
如何通过OpenCV 及C++ 来调整对比度,下面采用最简单的方法来调整对比度。
左下角为原图,右上角为低对比度,右下角为高对比度。
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]看成源图像像素,把后面的
看成输出图像像素。
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 |
Contrast Increased |
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; }
相关文章推荐
- 淘宝架构发展
- 如何安装linux mint/ubuntu windows系统
- linux ftp设置
- Hadoop学习-基础环境搭建
- terminator 安装与配置
- awk、gawk、nawk、mawk的简单介绍
- Linux(CentOS6.x)下使用yum软件管理工具安装LNMP(Nginx+PHP+Mysql)环境并配置虚拟主机vhost
- Linux命令(一)
- windows下文件路径与Linux下文件路径的比较
- 《深入理解mybatis原理(七)》 MyBatis的架构设计以及实例分析
- Java之——使用JMX监控Tomcat
- centos安装MYSQL 5.6
- nginx 安装
- Hadoop 之 Shuffle and Sort
- adb 启动指定的activity
- linux --> Autoconf和Automake使用
- Error:Apostrophe not preceded by \ (
- Bash shell command 速查手册
- Linux下yum的基本使用
- linux select()详解( 二)-- UDP最简实例