做自己的第一個(gè)網(wǎng)站網(wǎng)站制作詳細(xì)流程
在網(wǎng)上找了很多圖像亮度的調(diào)整算法,下面是其中一種,可以通過(guò)條形框進(jìn)行調(diào)整,并實(shí)時(shí)的查看對(duì)應(yīng)參數(shù)值后的效果。
圖像亮度處理公式:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);
x 是輸入像素值
y 是輸出像素值
B 是亮度值, 范圍在[-1,1]之間
對(duì)比度處理公式:
k是調(diào)節(jié)對(duì)比度
k = tan( (45 + 44 * c) / 180 * PI );
c 是對(duì)比度值, 范圍在[-1,1]之間
下面是具體實(shí)現(xiàn)代碼
#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)
#define M_PI 3.1415926
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);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()
{src = imread("D:/vsproject/skin_beauty/jishu-image/face02/center.jpg");if (!src.data) {cout << "error read image" << endl;return -1;}namedWindow(window_name, WINDOW_NORMAL);resizeWindow(window_name, 800, 600);//設(shè)置窗口展示大小createTrackbar("brightness", window_name, &brightness, 2 * brightness, callbackAdjust);createTrackbar("contrast", window_name, &contrast, 2 * contrast, callbackAdjust);callbackAdjust(0, 0);waitKey();return 0;}