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