导读

本期将介绍并演示OpenCV中使用illuminationChange实现图像中局部区域亮度调整的效果。

介绍

​OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C++源码)​

​OpenCV无缝融合应用(二)--指定目标颜色改变(附C++源码)​

illuminationChange与seamlessClone和colorChange同属于Seamless Cloning部分,算法均来自下面这篇论文:OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_滑动条

​https://www.cs.jhu.edu/~misha/Fall07/Papers/Perez03.pdf​

百度网盘下载:

链接:https://pan.baidu.com/s/1Ma_9ZF4r0SgNmfygHe3kgQ

提取码:0857

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_c++_02

将适当的非线性变换应用于所选内容中的梯度场,然后与泊松解算器集成在一起,可以改变图像局部的亮度,这对于突出曝光不足的前景对象或减少镜面反射很有用。用illuminationChange函数可以将一幅图像中的指定区域的亮度改(变亮(突出曝光不足的前景对象)或变暗(减少镜面反射))并自然融合。函数说明:

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_c++_03

参数:

src

输入8位3通道图像(截取目标的大图)

mask

输入8位1或3通道图像(待改变颜色目标掩码区域图像)

dst

输出结果图(要求和src相同的大小和类型)

alpha

算法中的α值(建议取值范围0.0~2.0)

beta

算法中的β值(建议取值范围0.0~2.0)

效果展示

分别实现指定区域亮度变暗(减少橙子表面因镜面反射造成的曝光过度)和变亮(突出曝光不足的前景对象-人):

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_滑动条_04

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_滑动条_05

实现步骤与源码

程序实现步骤:

(1) 使用selectROI函数框选指定目标;

(2) 使用;两个滑动条动态改变alpha和beta参数的值;

(3) 滑动条回调函数中使用illuminationChange函数完成亮度改变。

src图:

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_c++_06

框选ROI区域设定mask与参数设置(alpha=0.2, beta=0.2)以及运行结果:

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_滑动条_07

src图:

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_#include_08

鼠标拖动勾选人的轮廓部分(alpha=3.57, beta=0.09)以及运行结果:

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_c++_09

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_#include_10

效果展示以上,C++源码如下:

#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深度学习。

OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)_#include_11