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

2021-03-25 15:29:11 浏览数 (1)

导读

本期将介绍并演示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深度学习。

0 人点赞