响水做网站找哪家好,网站被挂黑后果,wordpress改模版,如何推广好一个产品目标
访问像素值用0来初始化矩阵cv::saturate_cast像素转换提高一张图像的亮度
原理
图像处理
图像变换可以被视作两个步骤#xff1a;
点操纵#xff08;像素转换#xff09;相邻区域转换#xff08;以面积为基础#xff09;
像素转换
在这种图像处理的转换过程中…目标
访问像素值用0来初始化矩阵cv::saturate_cast像素转换提高一张图像的亮度
原理
图像处理
图像变换可以被视作两个步骤
点操纵像素转换相邻区域转换以面积为基础
像素转换
在这种图像处理的转换过程中每个输出的像素的值都取决于相对应的输入的像素的值。此类操作的示例包括亮度和对比度调整以及颜色校正和转换。
亮度和对比度的调整
两种常用的点处理是带常数的乘法和加法: 参数α 0 和 β 通常被叫做gain和bias参数该参数将被用来控制对比度和亮度。你可以简单地把f(x)当作原图像素g(x)当作输出图像的像素那么我们可以将表达式写成 此处的i和j代表像素点的位置i行j列
源码
#include opencv2/imgcodecs.hpp
#include opencv2/highgui.hpp
#include iostream// were NOT using namespace std; here, to avoid collisions between the beta variable and std::beta in c17
using std::cin;
using std::cout;
using std::endl;
using namespace cv;int main( int argc, char** argv )
{
// 加载图像CommandLineParser parser( argc, argv, {input | lena.jpg | input image} );Mat image imread( samples::findFile( parser.getString( input ) ) );if( image.empty() ){cout Could not open or find the image!\n endl;cout Usage: argv[0] Input image endl;return -1;}// 构建一个新的与原图相同大小和类型的像素为零的图像Mat new_image Mat::zeros( image.size(), image.type() );// 获取参数 α和βdouble alpha 1.0; /* Simple contrast control */int beta 0; /* Simple brightness control */cout Basic Linear Transforms endl;cout ------------------------- endl;cout * Enter the alpha value [1.0-3.0]: ; cin alpha;cout * Enter the beta value [0-100]: ; cin beta;// 遍历图像应用线性变化// 需注意一个像素点有三个通道BGR or 0, 1, 2for( int y 0; y image.rows; y ) {for( int x 0; x image.cols; x ) {for( int c 0; c image.channels(); c ) {new_image.atVec3b(y,x)[c] saturate_castuchar( alpha*image.atVec3b(y,x)[c] beta );}}}imshow(Original Image, image);imshow(New Image, new_image);waitKey();return 0;
}此外除了使用上述的for循环来遍历图片的每一个像素点我们还可以使用cv::Mat::convertTo来实现只是上述代码用来更加详细的展示其应用过程。
image.convertTo(new_image, -1, alpha, beta);α和β参数
伽马矫正是另一个用来矫正图片亮度的技术。增加或减少β值将会为每一个像素增加或减少一个固定的常量值。像素值不在[0,255]范围内的将会被饱和超过255的被压缩到255小于0的被压缩到0。 浅灰色为原始图像的直方图Gimp中亮度 80时为深灰色。GIMPGNU Image Manipulation Program是一款自由和开源的图像编辑软件用于图像的润色、编辑和制作。
直方图表示每个颜色级别具有该颜色级别的像素数。深色图像会有许多低颜色值的像素因此直方图会在其左侧呈现一个峰值。当添加恒定偏差时直方图向右移动因为我们已经向所有像素添加了恒定偏差。
α参数将会修改色阶分布的方式。如果α小于1色阶将被压缩结果将是一个对比度较低的图像。 浅灰色为原始图像的直方图Gimp中对比度 0时为深灰色。
请注意这些直方图是使用Gimp软件中的亮度-对比度工具获得的。亮度工具应该与β偏置参数相同但对比度工具似乎与α增益不同其中输出范围似乎以Gimp为中心(正如您可以在前面的直方图中注意到的那样)。
简单来说β和亮度相关但在提高亮度的同时对比度也会降低图像会出现轻微的模糊。α增益可以用来通过调整对比度减少这种影响但由于过于饱和我们也可能失去一些原来明亮区域的细节。具体两个参数的值设置成多少要看具体需求。
伽马矫正
伽马矫正可以通过使用一个从输入的值到映射的输出值的非线性转换来矫正一个图像的亮度。如下所示 由于联系的非线性对于所有的像素的影响并不相同且受限于其的原本的值。 当γ1时原本的黑暗区域将会变得更亮直方图会向右平移代表亮度的提高。这种情况适用于增强图像中暗处的细节。
当γ1时原本的明亮区域将会变得更暗直方图会向左平移代表亮度的减少。这种情况适用于则增强图像中亮部的细节或整体实现较暗的色调。
通过调整γ值可以有效地根据需求来突出不同的特征。
实际的例子 link
举一个实际的例子来矫正一个曝光不足的图片参数为α1.3β40 尽管整体亮度得到了提高但是你仍然可以注意到丢失了一些信息比如图中的云由于过度饱和失去了相应的细节。
当我们应用伽马矫正来进行相应的图片矫正γ0.4 由于映射是非线性的并且不像以前的方法那样可能存在数值饱和因此伽马校正能够添加较少的饱和效应也就是说伽马矫正能够保留更多的细节无论是原图中黑暗的区域还是明亮的区域。但是具体的γ值需要在使用中去实践。 上图比较了三个图像的直方图(三个直方图之间的y范围不相同)。您可以注意到大多数像素值位于原始图像直方图的下部。校正后我们可以在255处观察到一个大的峰值这是由于饱和度以及右边的偏移。经过伽玛校正后直方图向右偏移但暗区像素比亮区像素偏移更大(见伽玛曲线图)。
代码部分
伽马矫正的代码如下 Mat lookUpTable(1, 256, CV_8U);uchar* p lookUpTable.ptr();for( int i 0; i 256; i)p[i] saturate_castuchar(pow(i / 255.0, gamma_) * 255.0);Mat res img.clone();LUT(img, lookUpTable, res);查询表被用来提高计算性能伽马校正LUT的计算通常涉及到对每个像素进行幂运算而查找表方法只需要预先计算出256个值然后在实际处理图像时快速查找和应用这些预先计算的值从而加快处理速度。
额外资源
CRT显示器上的伽玛校正和图像图形渲染中的伽马矫正数码曝光技术