这是什么情况,u盘传东西慢穿一次再传第二次就这样,好长时间不变化。内存够也不是接口松

下次自动登录
现在的位置:
& 综合 & 正文
学习OpenCV范例(五)——改变图像的对比度和亮度
学习到范例五的时候,发觉虽然范例都很简单,但是做记录的时候,并且把里面使用过的类或方法都弄明白,也就不简单了,接下来介绍一下范例五吧。
1、图像处理
一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。
图像变换可分为以下两种:
点算子(像素变换):图像对比度和亮度,等等
邻域(基于区域的)算子:均值滤波,中值滤波,等等,也就是卷积运算
2、亮度和对比度调整
两种常用的点过程(即点算子),是用常数对点进行 乘法 和 加法 运算:
一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。
看成源图像像素,把
看成输出图像像素。这样一来,上面的式子就能写得更清楚些:
表示像素位于 第i行 和 第j列 。
3、运行如下:
程序使用三种方式来实现亮度和对比度的调整,并且输出了各自运算的时间。
#include "stdafx.h"
#include &opencv2/core/core.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &iostream&
/**& 控制对比度 */
/**& 控制亮度 */
int main( int argc, char** argv )
/// 读入用户提供的图像
Mat image = imread( "Lena.jpg" );
Mat new_image = Mat::zeros( image.size(), image.type() );
Mat new_image1 = Mat::zeros( image.size(), image.type() );
Mat new_image2 = Mat::zeros( image.size(), image.type() );
/// 初始化
cout && " Basic Linear Transforms " &&
cout && "-------------------------" &&
cout && "* Enter the alpha value [1.0-3.0]: ";
cout && "* Enter the beta value [0-100]: ";
t = (double)getTickCount();
/// 执行运算 new_image(i,j) = alpha*image(i,j) + beta
for( int y = 0; y & image. y++ )
for( int x = 0; x & image. x++ )
for( int c = 0; c & 3; c++ )
new_image.at&Vec3b&(y,x)[c] = saturate_cast&uchar&( alpha*( image.at&Vec3b&(y,x)[c] ) + beta );
t = 1000*((double)getTickCount() - t)/getTickFrequency();
cout && ".at+[] Times passed in milliseconds: " && t &&
t = (double)getTickCount();
int nr= image. // number of rows
int nc= image.cols * image.channels(); // total number of elements per line
for (int y=0; y& y++)
uchar* data= image.ptr&uchar&(y);
uchar* data1=new_image1.ptr&uchar&(y);
for (int x=0; x& x++)
data1[x]=saturate_cast&uchar&(alpha*data[x]+beta);
t = 1000*((double)getTickCount() - t)/getTickFrequency();
cout && ".ptr+[] Times passed in milliseconds: " && t &&
t = (double)getTickCount();
image.convertTo(new_image2, -1, alpha, beta);
t = 1000*((double)getTickCount() - t)/getTickFrequency();
cout && "convertTo Times passed in milliseconds: " && t &&
/// 创建窗口
namedWindow("Original Image", 1);
namedWindow("New Image", 1);
namedWindow("New Image1", 1);
namedWindow("New Image2", 1);
/// 显示图像
imshow("Original Image", image);
imshow("New Image", new_image);
imshow("New Image1", new_image1);
imshow("New Image2", new_image2);
/// 等待用户按键
waitKey();
4、运行结果:
图2、.at方法
图3、.ptr方法
图4、convertTo方法
图5、运行时间
从运行时间可以看出,使用OpenCV自带的函数运行效率最高,而使用.ptr方法比.at方法好,这也印证了前面博客所说的。
6、用到的类
convertTo:
功能:通过缩放比例将数组变换成其他类型
void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 ) const
m:输出图像
rtype:输出图像的类型
alpha:比例因子α,决定对比度
beta:附加值β,决定亮度
函数原理如下:
saturate_cast:
功能:防止数据溢出
为什么上面的函数会用到saturate_cast呢,因为无论是加是减,乘除,都会超出一个像素灰度值的范围(0~255)所以,所以当运算完之后,结果为负,则转为0,结果超出255,则为255。
&&&&推荐文章:
【上篇】【下篇】学习OpenCV(四) 改变图像的对比度和亮度——像素变换
在上篇文章中,我们介绍了如何用filter2D函数来对图像进行邻域变换。这篇文章我们来简单介绍一下如何对图像的像素进行变换。
对图像的单个像素进行变换,是图像处理中一个很常见的操作。比如改变图像的亮度,对图像像素进行线性变换,二值化等。下面将以改变图像的对比度和亮度来举例。
改变图像的对比度和亮度,归根到底,就是下面的这个数学公式:
这个式子很好理解。就是将原来图像中的像素值进行比例变换,后又进行了移动。alpha一般叫做增益参数,表征对比度,而beta成为偏置参数,表征亮度变化。
对图像的每个像素进行操作,其实我们在前面的文章中已经介绍过了,比如LUT查表操作,直接用指针访问,或是用迭代器等。下面的这段代码实现了对图像对比度和亮度的这一操作,我们用指针实现:
#include &iostream&
#include &opencv2/core/core.hpp&
#include &opencv/cv.hpp&
#include &opencv2/highgui/highgui.hpp&
Mat ChangePixel(const Mat& img,const double alpha,const int beta)
Mat newImg=Mat::zeros(img.size(),img.type ());
// the img to be returned
int chnnels=img.channels ();
//Get the channels of source img
for (int x=0;x&img.x++)
//iteration rows
//用指针访问
const uchar *p=img.ptr &uchar&(x);
//由于img被声明为const,所以指针也要声明为const
uchar *q=newImg.ptr &uchar&(x);
int cols=img.cols*
for (int y=0;y&y++)
q[y]=saturate_cast&uchar&(p[y]*alpha+beta);
//注意saturate_cast的使用
return newI
int main()
int64 time_start=getTickCount ();
Mat A=imread (&lena.jpg&,CV_LOAD_IMAGE_COLOR);
imshow (&A的图像&,A);
Mat B=ChangePixel (A,2,0);
imshow (&B的图像&,B);
int64 time_end=getTickCount ();
double time_take=(time_end-time_start)*1000.0/getTickFrequency ();
cout&&&The time is &&&time_take&&&ms&&&
waitKey ();
注意代码中saturate_cast函数的使用。这个函数用来完成一个类型到另一个类型的转换(当然,这种类型的转换必须是被允许的)。而如果被转换的值超过了目的类型的界限时,该函数会自动返回界限值。
这样,我们就实现了对图像对比度和亮度的变换操作:
不过,OpenCV中已经有了进行这样处理的函数:Mat::convertTo,它可以完成图像的数据类型转换,同时,对像素值进行改变。
如果参数中的rType为负数,则转换前后图像的类型不变,所以,我们可以用一行代码实现我们原来的操作:
A.convertTo (B,-1,2,0);
而且,在我的电脑上通过试验,通过这种方法进行操作,所花时间也变少了。
本分类共有文章6篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";图像处理(7)
关于图像对比度【1】
对比度和线性变换
关于什么是对比度这事,不好用一个很明确很严谨的词来概括清楚。对比度高,画面看上去就很硬朗,对比度低,画面看上去就朦朦胧胧,比如下面这张图:
对比度和颜色没有关系,换句话说如果使用YUV颜色空间的话,那对比度只与Y通道值(亮度)有关。所以在这里,就先不提颜色了。
针对8位灰度图来说,对比度高,就是白的很白(值接近0),黑的很黑(接近255)。
于是乎,要提高对比度,只要把黑的变黑,白的变白就可以了。最简单的方法,把图上的每个像素的值都作一个线性变换。
如果原图上像素值最大的点值为max(可能离255还很远),像素值最小的点的值为min(可能离0值也很远),线性变换就是要把值域(min,max)拉伸到(0,255)。所以很简单了:y=k(x-min),其中k权且叫做拉伸系数吧,k=255/(max-min)。
把上面这张图,按照上文说的,做一下线性变换,于是得到了如下结果。
ok,对比度确实提高了。
另外说一点儿,上文说道的max和min并不真的就是整张图上的最大值和最小值,实际上如果真的使用绝对的最大值和最小值的话,往往效果很差(值最大的那个点和值最小的那个点很有可能是坏点,或者是由噪声的影响)。一个方法是max取最大的5%的像素的值,min取最小的5%的像素的值(也未必一定是5%)。
对上面这两张图做一下直方图统计,线性变换前的直方图如下:
线性变换后呢,直方图如下:
所以从直方图上看,线性变换不过就是把直方图移动了个位置,做了个拉伸而已。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4789次
排名:千里之外2004.3 基于小波变换的低光照对比度或强噪声背景下图像增强与目标提取方法_闫敬文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2004.3 基于小波变换的低光照对比度或强噪声背景下图像增强与目标提取方法_闫敬文
上传于||文档简介
&&期​刊​类​ ​ ​基​于​小​波​变​换​的​图​像​增​强
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢画面直播的马赛克效果_百度文库

我要回帖

更多关于 电脑往u盘传东西慢 的文章

 

随机推荐