opencv中的图像亮度变换(图像增强)

来源:互联网 发布:流体计算软件app 编辑:程序博客网 时间:2024/05/29 18:52

项目中遇到了图像对比度不强的图像,于是想通过对图像进行亮度变换以达到预期的图像,于是研究了一下图像的亮度变换。其实,之前在matlab中也碰到过,在冈萨雷斯的《数字图像处理(matlab版)》第47页,有对亮度变换函数imadjust进行了讲解。当然啦,也可以直接通过matlab的help,查看imadjust的用法:

J = imadjust(I)J = imadjust(I,[low_in; high_in],[low_out; high_out])J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma)newmap = imadjust(map,[low_in; high_in],[low_out; high_out],gamma)RGB2 = imadjust(RGB1,...)

需要注意的是:low_in,high_in,low_out, high_out都在[0,1]之间,并且low_in 必须要小于high_in的,但是low_out 则可以大于high_out,这相当于对图像进行了反转。gamma不写的时候,默认是1,且当gamma小于1的时候趋向更亮;当gamma大于1的时候趋向于更暗。

下面我们直接上代码:

>> I = imread('rice.tif');>> J = imadjust(I,[0,0.5],[0.5,1]);>> imshow(I)>> figure,imshow(J)>> 
效果图:



由于需要在项目中使用,所以不得不转换使用OpenCV来实现它。

环境:OpenCV2.46 + VS2010

代码如下:

// opencv学习笔记-图像亮度变换(图像增强).cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <opencv.hpp>using namespace cv;using namespace std;int imageAdjust(Mat &src,Mat &dst,  double low_in,double high_in,double low_out,double high_out,double gamma) {if ( low_in < 0 && low_in >1 && high_in <0 && high_in >1&& low_out < 0 && low_out > 1 && high_out < 0 && high_out > 1&& low_out > high_out )return -1;double low2 = low_in*255;double high2 = high_in*255;double bottom2 = low_out*255;double top2 = high_out*255;double err_in = high2 - low2;double err_out = top2 - bottom2;int x, y;double val;uchar* p;//亮度变换for ( y = 0; y < src.cols; y++){p = src.ptr<uchar>(y);  //行指针for ( x = 0; x < src.rows; x++){val = pow((p[x] - low2)/err_in,gamma)*err_out + bottom2;if (val > 255 )val = 255;if (val < 0 )val = 0;dst.at<uchar>(y,x) = (uchar) val;}}}int _tmain(int argc, _TCHAR* argv[]){Mat src;//读取图像src = imread("C:\\Documents and Settings\\Administrator\\My Documents\\MATLAB\\rice.tif",0);if(src.data == NULL){cout << "read image failed" << endl;return -1;}//显示源图像imshow("rice【源图像】",src);Mat dst = src.clone();//图像亮度变换imageAdjust(src,dst,0,0.5,0.5,1,1);imshow("亮度变换后的图",dst);waitKey(0);return 0;}

效果图:



参考:

1.OpenCV 下面的图像亮度变换

 


0 0
原创粉丝点击