偶然在IPOL见到了这篇paper,虽然之前复现的一些paper已经可以较好的处理低照度下的色彩恢复,然而在光度强度很大的情况下怎么恢复还不清楚,并且如果出现图片中既有很亮的部分,又有很暗的部分,又不知道怎么处理了。这篇paper,正式为了解决这一问题,他的局部颜色矫正,和He KaiMing的暗通道去雾有相似的想法,值得借鉴。论文地址为:http://www.ipol.im/pub/art/2011/gl_lcc/ 。IPOL是一个非常好的学习数字图像处理的网站,上面的论文都是提供配套源码的,如果平时在数字图像处理方面想找一些Idea,不妨上去看看。
首先对于太亮和太暗的图像,我们可以使用Gamma校正和直方图均衡化来提高对比度。
分别代表较暗图像,Gamma系数为0.5的Gamma校正,直方图均衡化
分别代表较亮的原始图像,Gamma系数为2.5的Gamma校正,直方图均衡化
分别代表原始图像,Gamma系数为0.5,2.5,0.75,1.5的Gamma校正图像
使用Gamma校正后可以提高图像的动态范围,实际上作者讲这么多实际是要说,如果当图像既有较亮又有较暗的区域时,如果仅仅使用一个Gamma矫正输出的图像效果反而会变差,这是因为Gamma矫正是全局的方法,某一部分相近的像素将被映射到相同的灰度值,并没有考虑待到像素邻域的信息。对于普通的过亮和过暗的图像,当图像的平均灰度大于127.5使用,对图像的亮度进行抑制;当图像的灰度信息均值小于127.5时使用对图像亮度进行增强。这里我们假设图像用无符号8bit表示,那么。在既有较暗又有较亮的区域的图像中,全局Gamma失效,这时候作者就提出了利用图像邻域的信息,进行Gamma矫正。对较暗的区域进行增加亮度,对较亮的区域降低亮度。局部颜色校正的方法可以根据邻域内像素的灰度值情况,把统一输入像素值,映射成不同水平的像素灰度值。
Mat LCC(const Mat &src){
int rows = src.rows;
int cols = src.cols;
int **I;
I = new int *[rows];
for(int i = 0; i < rows; i++){
I[i] = new int [cols];
}
int **inv_I;
inv_I = new int *[rows];
for(int i = 0; i < rows; i++){
inv_I[i] = new int [cols];
}
Mat Mast(rows, cols, CV_8UC1);
for(int i = 0; i < rows; i++){
uchar *data = Mast.ptr<uchar>(i);
for(int j = 0; j < cols; j++){
I[i][j] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[1]) / 3.0;
inv_I[i][j] = 255;
*data = inv_I[i][j] - I[i][j];
data++;
}
}
GaussianBlur(Mast, Mast, Size(41, 41), BORDER_DEFAULT);
Mat dst(rows, cols, CV_8UC3);
for(int i = 0; i < rows; i++){
uchar *data = Mast.ptr<uchar>(i);
for(int j = 0; j < cols; j++){
for(int k = 0; k < 3; k++){
float Exp = pow(2, (128 - data[j]) / 128.0);
int value = int(255 * pow(src.at<Vec3b>(i, j)[k] / 255.0, Exp));
dst.at<Vec3b>(i, j)[k] = value;
}
}
}
return dst;
}
所有的图片顺序均为处理前和处理后的顺序。
今天介绍了一篇IPOL的对不均匀光照图像的局部校正论文,希望通过原理分析和代码实现对大家有所帮助。
欢迎关注我的微信公众号GiantPandaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!