本期将介绍并演示OpenCV中使用illuminationChange实现图像中局部区域亮度调整的效果。
介绍
OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C 源码)
OpenCV无缝融合应用(二)--指定目标颜色改变(附C 源码)
illuminationChange与seamlessClone和colorChange同属于Seamless Cloning部分,算法均来自下面这篇论文:
https://www.cs.jhu.edu/~misha/Fall07/Papers/Perez03.pdf
百度网盘下载:
链接:https://pan.baidu.com/s/1Ma_9ZF4r0SgNmfygHe3kgQ
提取码:0857
算法解读可参考下面链接:
https://blog.csdn.net/zhaoyin214/article/details/88196575
将适当的非线性变换应用于所选内容中的梯度场,然后与泊松解算器集成在一起,可以改变图像局部的亮度,这对于突出曝光不足的前景对象或减少镜面反射很有用。用illuminationChange函数可以将一幅图像中的指定区域的亮度改(变亮(突出曝光不足的前景对象)或变暗(减少镜面反射))并自然融合。函数说明:
参数:
src | 输入8位3通道图像(截取目标的大图) |
---|---|
mask | 输入8位1或3通道图像(待改变颜色目标掩码区域图像) |
dst | 输出结果图(要求和src相同的大小和类型) |
alpha | 算法中的α值(建议取值范围0.0~2.0) |
beta | 算法中的β值(建议取值范围0.0~2.0) |
效果展示
分别实现指定区域亮度变暗(减少橙子表面因镜面反射造成的曝光过度)和变亮(突出曝光不足的前景对象-人):
实现步骤与源码
程序实现步骤:
(1) 使用selectROI函数框选指定目标;
(2) 使用;两个滑动条动态改变alpha和beta参数的值;
(3) 滑动条回调函数中使用illuminationChange函数完成亮度改变。
src图:
框选ROI区域设定mask与参数设置(alpha=0.2, beta=0.2)以及运行结果:
src图:
鼠标拖动勾选人的轮廓部分(alpha=3.57, beta=0.09)以及运行结果:
效果展示以上,C 源码如下:
代码语言:javascript复制#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat src;
int alpha = 20, beta = 40;
Rect rect;
void illuminationChange_Callback(int, void*)
{
Mat dst;
Mat mask = Mat::zeros(src.size(), src.type());
rectangle(mask, rect, Scalar::all(255), -1);
illuminationChange(src, mask, dst, alpha / 100.0, beta / 100.0);
imshow("illuminationChange", dst);
}
int main()
{
src = imread("1.png");
rect = selectROI(src, true, false);
namedWindow("illuminationChange", WINDOW_NORMAL);
createTrackbar("alpha", "illuminationChange", &alpha, 300, illuminationChange_Callback);
createTrackbar("beta", "illuminationChange", &beta, 300, illuminationChange_Callback);
illuminationChange_Callback(0, 0);
waitKey();
return 0;
}
更多视觉图像处理相关内容,请长按关注:OpenCV与AI深度学习。