opencv 實現 Photoshop 亮度 對比度 調節功能

源碼

VirtualStudio2019的工程。可直接運行

Photoshop的亮度對比度工具

這是photoshop的工具,下面用opencv實現該功能

在這裏插入圖片描述

LUT 顏色查找表

LUT 的作用很簡單,就是將其像素的灰度值轉換爲規定的灰度值。

例如:我們想將一張圖片灰度爲0-100的像素的灰度變成0,101-200的變成100,201-255的變成255。我們就可已建立如下的一張表格;
位置
1 0
2 0
100 0
101 100
102 100
200 100
201 200
202 200
255 200

當把此表格應用到圖片時,圖片0-100灰度的像素灰度就變成0,101-200的變成100,201-255的就變成255。

多通道圖片使用單通道的LUT是則所有通道都用同一個LUT

代碼

void brightnesscallback(int pos, void* usrdata) {
	cv::Mat src = *(cv::Mat*)(usrdata);
	cv::Mat dst;
	double PI = 3.1415926;
	double B = ((double)pos - 255) / 255;
	double c = ((double)contrast - 255) / 255;
	double k = tan((45 + 44 * c) / 180 * PI);

	cv::Mat lookupTable(1, 256, CV_8UC1);
	uchar* p = lookupTable.data;
	for (int i = 0; i < 256; i++) {
		p[i] = CLIP_RANGE((i - 127.5 * (1 - B)) * k + 127.5 * (1 + B), 0, 255);
	}

	cv::LUT(src, lookupTable, dst);
	cv::imshow(window_name, dst);
}

void contrastcallback(int pos, void* usrdata) {
	cv::Mat src = *(cv::Mat*)(usrdata);
	cv::Mat dst;
	double PI = 3.1415926;
	double B = ((double)brightness - 255) / 255;
	double c = ((double)pos - 255) / 255.;
	double k = tan((45 + 44 * c) / 180 * PI);

	cv::Mat lookupTable(1, 256, CV_8U);
	uchar* p = lookupTable.data;
	for (int i = 0; i < 256; i++) {
		p[i] = CLIP_RANGE((i - 127.5 * (1 - B)) * k + 127.5 * (1 + B), 0, 255);
	}
	cv::LUT(src, lookupTable, dst);
	cv::imshow(window_name, dst);
}

int main() {
	cv::Mat src = cv::imread("./1.jpg", cv::IMREAD_COLOR);
	if (!src.data) {
		std::cout << "error: no image" << std::endl;
		return 0;
	}

	cv::namedWindow(window_name, 0);
	createTrackbar("brightness", window_name, &brightness, 2 * brightness, brightnesscallback, &src);
	createTrackbar("contrast", window_name, &contrast, 2 * contrast, contrastcallback, &src);

	cv::imshow(window_name, src);
	cv::waitKey();
	return 0;
}

效果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章