OpenCV与AI深度学习 | OpenCV无缝融合应用--指定目标颜色改变(附C++源码)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:OpenCV无缝融合应用--指定目标颜色改变(附C++源码)

导读

本期将介绍并演示OpenCV中使用colorChange实现图像中指定目标颜色改变的效果。

介绍

colorChange与seamlessClone同属于Seamless Cloning部分,算法均来自下面这篇论文:

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

百度网盘下载:

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

提取码:0857

算法解读可参考下面链接:

https://blog.youkuaiyun.com/zhaoyin214/article/details/88196575

使用colorChange函数可以轻松将一幅图像中的指定目标颜色改变并尽可能保留其边缘信息,自然融合。函数说明:

参数:

src输入8位3通道图像(截取目标的大图)
mask输入8位1或3通道图像(待改变颜色目标掩码区域图像)
dst输出结果图(要求和src相同的大小和类型)
red_mul红色通道乘积因子(建议值0.5~2.5)
green_mul绿色通道乘积因子(建议值0.5~2.5)

blue_mul

蓝色通道乘积因子(建议值0.5~2.5)

实现步骤与源码

程序实现步骤:

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

(2) 使用三个滑动条动态改变red_mul,green_mul,blue_mul参数值;

(3) 滑动条回调函数中使用colorChange函数完成颜色改变。

src图:

框选ROI区域设定mask与参数设置(red_mul=1.0, green_mul=1.78, bule_mul=2.35)以及运行结果:

src图:

框选ROI区域设定mask与参数设置(red_mul=1.17, green_mul=0.47, bule_mul=1.23)以及运行结果:

src图:

框选ROI区域设定mask与参数设置(red_mul=0.18, green_mul=1.17, bule_mul=2.35)以及运行结果:

(red_mul=0.17, green_mul=1.18, bule_mul=0)运行结果:

效果见开头效果视频,C++源码如下:

#include <iostream>#include <opencv2/opencv.hpp>
using namespace std;using namespace cv;
Mat src;int r = 100, g = 100, b = 100;Rect rect;
void colorChange_Callback(int, void *){  Mat dst;  Mat mask = Mat::zeros(src.size(), src.type());  rectangle(mask, rect, Scalar::all(255), -1);  colorChange(src, mask, dst, r/100.0, g/100.0, b/100.0);  imshow("colorChange", dst);}
int main(){  src = imread("4.jpg");  rect = selectROI(src, true, false);  namedWindow("colorChange", WINDOW_NORMAL);  createTrackbar("R", "colorChange", &r, 250, colorChange_Callback);  createTrackbar("G", "colorChange", &g, 250, colorChange_Callback);  createTrackbar("B", "colorChange", &b, 250, colorChange_Callback);  colorChange_Callback(0, 0);
  waitKey();  return 0;}

注意:如果希望得到更准确的结果,可以用提取轮廓的方法精确设置mask,这样颜色改变后不会更改其他区域。比如唇色替换,可以先通过人脸关键点提取后,裁剪出嘴唇部分轮廓作为mask,这样结果也会更准确。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值