源碼
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;
}
效果