光照不均介绍
光照不均在图像处理中常常遇到,在工业检测中,一般要求平面上的灰度差不大于20(灰度区间:0-255)。正常情况下,通过光学(相机光源等设备)调整即可达到能检测要求。也有一些情况下光学调整无法满足或者对整体灰度差异变化敏感时需要考虑算法校正(光照不均)。
这也是浓淡补正方法中比较重要的一步。
光照不均算法处理原理
光照不均的处理方式就是把光照分布特征提取出来,再根据这个“分布”来逐点补偿原图灰度值即可。具体步骤如下:
- 使用模糊化 消除图像细节,一般用高斯模糊(比较费时),在核(Size)较大情况下效果差不多,不用纠结;
- 将模糊化后的图片作为阴影模式(光照分布特征),它近似代表了图片上的光照分布,用原图减去阴影模式得到几乎没有光照分布的图像(但是有之前模糊掉的细节);
- 对此时暗淡的图像进行归一化将灰度值拉伸到整个灰度区间(0-255);
- 进一步地,可以继续使用对比度增强等方法来调整图像效果;
- 除了使用上述减法外,还可以使用除法来实现,早期研究matlab时候使用过:matlab去除图片中的阴影(用高斯模糊估计阴影模式).
代码实现
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
// 读取灰度图像
Mat src = imread("C:\\Users\\Administrator\\Desktop\\result.jpg", IMREAD_GRAYSCALE);
if (src.empty()) {
cout << "图像加载失败!" << endl;
return -1;
}
// 使用高斯模糊估算阴影(光照)模式
Mat shadow;
GaussianBlur(src, shadow, Size(71, 71), 0);
// 用原图减去阴影模式
Mat result;
subtract(src, shadow, result);
// 归一化到0~255
normalize(result, result, 0, 255, NORM_MINMAX);
// 保存结果
imwrite("C:\\Users\\Administrator\\Desktop\\resultNoShadow.jpg", result);
// 图像增强(线性增强)
Mat result_enhanced;
result_enhanced = result * 2.0 - 0;
imwrite("C:\\Users\\Administrator\\Desktop\\resultEnhanced.jpg", result_enhanced);
return 0;
}
结论
图片从左到右依次是原图(上一节OpenCV(C++)学习笔记六:抠图(ROI提取)中的结果图)、原图减去光影模式后的图像、增强后的最终图像。这里看起来效果似乎不是那么明显,但是处理后分割图像变得相对容易。原图本来是坐在车内用手机拍摄的,白斑实际是车窗玻璃上白云的干扰成像,如果有实际的光照不均图像效果会更好。效果也可以参考之前那篇matlab去除图片中的阴影(用高斯模糊估计阴影模式).