# 用OpenCV实现Photoshop算法(五): 亮度对比度调整

（一）算法
亮度对比度调整的算法，我在网上找了很多篇，个人觉得以下这个算法效果较好，比较接近Photoshop的效果。
Algorithm of Brightness Contrast transformation
The formula is:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);

x is the input pixel value
y is the output pixel value
B is brightness, value range is [-1,1]
k is used to adjust contrast
k = tan( (45 + 44 * c) / 180 * PI );
c is contrast, value range is [-1,1]

（二）源码及例程

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

#define SWAP(a, b, t)  do { t = a; a = b; b = t; } while(0)
#define CLIP_RANGE(value, min, max)  ( (value) > (max) ? (max) : (((value) < (min)) ? (min) : (value)) )
#define COLOR_RANGE(value)  CLIP_RANGE(value, 0, 255)

/**
*
* @param src [in] InputArray
* @param dst [out] OutputArray
* @param brightness [in] integer, value range [-255, 255]
* @param contrast [in] integer, value range [-255, 255]
*
* @return 0 if success, else return error code
*/
int adjustBrightnessContrast(InputArray src, OutputArray dst, int brightness, int contrast)
{
Mat input = src.getMat();
if( input.empty() ) {
return -1;
}

dst.create(src.size(), src.type());
Mat output = dst.getMat();

brightness = CLIP_RANGE(brightness, -255, 255);
contrast = CLIP_RANGE(contrast, -255, 255);

/**
Algorithm of Brightness Contrast transformation
The formula is:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);

x is the input pixel value
y is the output pixel value
B is brightness, value range is [-1,1]
k is used to adjust contrast
k = tan( (45 + 44 * c) / 180 * PI );
c is contrast, value range is [-1,1]
*/

double B = brightness / 255.;
double c = contrast / 255. ;
double k = tan( (45 + 44 * c) / 180 * M_PI );

Mat lookupTable(1, 256, CV_8U);
uchar *p = lookupTable.data;
for (int i = 0; i < 256; i++)
p[i] = COLOR_RANGE( (i - 127.5 * (1 - B)) * k + 127.5 * (1 + B) );

LUT(input, lookupTable, output);

return 0;
}

//=====主程序开始====

static string window_name = "photo";
static Mat src;
static int brightness = 255;
static int contrast = 255;

static void callbackAdjust(int , void *)
{
Mat dst;
adjustBrightnessContrast(src, dst, brightness - 255, contrast - 255);
imshow(window_name, dst);
}

int main()
{

if ( !src.data ) {
cout << "error read image" << endl;
return -1;
}

namedWindow(window_name);

waitKey();

return 0;

}


• 11
点赞
• 34
收藏
• 打赏
• 3
评论
12-17 22
05-04 221
10-22 806
09-01 3万+
04-28 455
06-23 855
08-31 5117
08-15 1万+
10-13 3928
02-25 783

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

JoStudio

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。