调整图像亮度brightness,对比度contrast,饱和度saturation方法整理
2013-03-16 00:29
483 查看
简单的实现方案数据格式:YUV参考链接1:Processing in the 8-bit YUV Color Space参考链接2:关于YUV图像的亮度和对比度的调整算法参考链接2中采用CxImage(关于CxImage,参考:转贴 CxImage类库使用说明 - 走在路上 - 博客频道 - CSDN.NET)库提供的处理方法,采用查表法处理效率很高。粘贴部分处理代码
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae83b3.png)
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae83c2.png)
CxImage\ximadsp.cpp
通过如下处理,就可以得到处理后图像了
其他方案:方案1. 基于Dirextx利用像素着色器实现图像的亮度,饱和度操作
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae8430.png)
参考链接:基于dirextx 利用像素着色器实现图像的亮度,饱和度,色相,对比度,变灰,反相操作该文提供一个源代码,编译时需要D3D相关的lib库。该程序将对图像处理的细节交个了D3D,通过设置一个D3DXMATRIX结构体完成亮度饱和度等的操作。优点:通过D3D实现,图片处理速度快效率高。缺点:需要了解D3D相关的知识,学习成本较大。方案2. 使用DirectDraw色彩控制IDirectDrawColorControl参考链接:http://www.codingnow.com/directx6/dx6_dd11.htm#gamma参考链接:http://www.dpfiles.com/dpfileswiki/index.php?title=Tricks_of_the_Windows_Game_Programming_Gurus%2C_Chapter_7:_Advanced_DirectDraw_and_Bitmapped_Graphics原理与DirectX类似,因为我做的项目其2D图像渲染是使用DirectDraw实现的,很自然的想到了使用这个方法,但要非常注意的是,你的显卡要能够支持IDirectDrawColorControl,也就是说DirectDraw能够提供相应capacity,很遗憾的是我的显卡并不支持该特性,你可以用如下代码测试是否该功能:
同样的,你需要对DirectDraw有必要的了解,如果是使用GDI来负责图像的绘制,那么DirectX和DirectDraw的方案并不适合。方案3 使用GDI+中的ColorMatrix
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae843f.png)
参考链接:灰度、对比度、亮度、饱和度基本图像处理源码参考链接:GDI+ for VCL基础 -- 颜色调整矩阵ColorMatrix详解
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae83b3.png)
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae83c2.png)
CxImage\ximadsp.cpp
/** * Changes the brightness and the contrast of the image. * \param brightness: can be from -255 to 255, if brightness is negative, the image becomes dark. * \param contrast: can be from -100 to 100, the neutral value is 0. * \return true if everything is ok */ bool CxImage ::Light (long brightness , long contrast ) { if (! pDib) return false; float c=(100 + contrast)/100.0f; brightness+=128; BYTE cTable[256]; //<nipper> for ( int i=0; i<256; i++) { cTable[ i] = ( BYTE) max(0, min(255,( int)(( i-128)* c + brightness + 0.5f))); } return Lut( cTable); } /** * Changes the saturation of the image. * \param saturation: can be from -100 to 100, positive values increase the saturation. * \param colorspace: can be 1 (HSL) or 2 (YUV). * \return true if everything is ok */ bool CxImage ::Saturate (const long saturation , const long colorspace ) { ... for (int i =0;i <256;i ++) { cTable[ i] = (BYTE)max(0,min (255,(int )((i -128)*(100 + saturation)/100.0f + 128.5f))); } ... }
通过如下处理,就可以得到处理后图像了
// Y分量,在对图像亮度和对比度进行调节后,通过查表 m_YTable获得新的Y 值 // pdst为转换后的图像,pbufy为原图像的Y分量 for ( int height=0; height< m_frameHeight; height ++) { for ( int width=0; width< m_frameWidth; width ++) { *pdst++ = cTable[*pbufy++]; } }
其他方案:方案1. 基于Dirextx利用像素着色器实现图像的亮度,饱和度操作
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae8430.png)
参考链接:基于dirextx 利用像素着色器实现图像的亮度,饱和度,色相,对比度,变灰,反相操作该文提供一个源代码,编译时需要D3D相关的lib库。该程序将对图像处理的细节交个了D3D,通过设置一个D3DXMATRIX结构体完成亮度饱和度等的操作。优点:通过D3D实现,图片处理速度快效率高。缺点:需要了解D3D相关的知识,学习成本较大。方案2. 使用DirectDraw色彩控制IDirectDrawColorControl参考链接:http://www.codingnow.com/directx6/dx6_dd11.htm#gamma参考链接:http://www.dpfiles.com/dpfileswiki/index.php?title=Tricks_of_the_Windows_Game_Programming_Gurus%2C_Chapter_7:_Advanced_DirectDraw_and_Bitmapped_Graphics原理与DirectX类似,因为我做的项目其2D图像渲染是使用DirectDraw实现的,很自然的想到了使用这个方法,但要非常注意的是,你的显卡要能够支持IDirectDrawColorControl,也就是说DirectDraw能够提供相应capacity,很遗憾的是我的显卡并不支持该特性,你可以用如下代码测试是否该功能:
// initializes a direct draw struct #define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); } // create IDirectDraw interface 7.0 object and test for error if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL))) return(0); DDCAPS hel_caps, hal_caps; // initialize the structures DDRAW_INIT_STRUCT(hel_caps); DDRAW_INIT_STRUCT(hal_caps); if (FAILED(lpdd->GetCaps(&hal_caps, &hel_caps))) return(0); if (hal_caps.dwCaps2 & DDCAPS2_COLORCONTROLPRIMARY) OutputDebugString(_T("Supports primary surface contains color controls\n")); if (hal_caps.dwCaps2 & DDCAPS2_COLORCONTROLOVERLAY) OutputDebugString(_T("Supports overlay surface contains color controls\n")); if (hal_caps.dwCaps2 & DDCAPS2_PRIMARYGAMMA) OutputDebugString(_T("Supports loadable gamma ramps for the primary surface\n"));
同样的,你需要对DirectDraw有必要的了解,如果是使用GDI来负责图像的绘制,那么DirectX和DirectDraw的方案并不适合。方案3 使用GDI+中的ColorMatrix
![](file:///C:/Users/ajaxhe/AppData/Local/Temp/enhtmlclip/EN00ae843f.png)
参考链接:灰度、对比度、亮度、饱和度基本图像处理源码参考链接:GDI+ for VCL基础 -- 颜色调整矩阵ColorMatrix详解
相关文章推荐
- 调整图像亮度brightness,对比度contrast,饱和度saturation方法整理
- 调整图像亮度brightness,对比度contrast,饱和度saturation方法整理
- JavaScript图像处理(2) - 亮度对比度调整(Brightness/Contrast)
- 基于图像内插值和外插值的亮度/对比度调整及模糊/锐化方法
- c# DirectShow 通过IAMVideoProcAmp的Set方法 来设置视频图像的Brightness 调整亮度
- c# DirectShow 通过IAMVideoProcAmp的Set方法 来设置视频图像的Brightness 调整亮度
- 图像处理------调整亮度与对比度 分类: 视频图像处理 2015-07-24 09:51 28人阅读 评论(0) 收藏
- [转]【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
- Delphi图像处理 -- 亮度/对比度调整
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- 数字图像处理 调整对比度的几种方法
- 图像处理------调整亮度与对比度
- 像素读取、创建Trackbar & 图像对比度、亮度值调整
- OpenCV学习:创建Trackbar & 图像对比度、亮度值调整
- 图像处理------调整亮度与对比度
- opencv:图像对比度、亮度值调整(理论基础)
- OpenCV------创建Trackbar & 图像对比度、亮度值调整
- 【opencv】 改变图像的对比度和亮度的两种方法
- 9.调整图像的对比度和亮度